Domanda

Sto cercando un algoritmo di hashing che produce un intero con segno 31/32 bit / unsigned come digest per una stringa utf8 con lo scopo di utilizzare l'uscita per la semina di un PRNG, come ad esempio un parco-Miller-Carta LCG o un Mersenne-Twister.

Ho esaminato FNV1 e FNV1a, ma forniscono valori molto vicini per le stringhe simili che differiscono nella loro ultimo carattere; Mi piacerebbe avere un hash bassa collisione che cambia radicalmente sulle modifiche minime sulla stringa di input. Le prestazioni non è un problema.

Il mio attuale approccio consiste in un LCG sporco che utilizza codici di caratteri e un numero primo da moltiplicatori:

a = 524287;
for ( i = 0; i < n; i ++ )
a = ( a * string.charCodeAt ( i ) * 16807 + 524287 ) % 2147483647;

Per favore fatemi sapere di eventuali alternative migliori.

È stato utile?

Soluzione

Se si sta generando valore a 32 bit, è possibile utilizzare CRC32 classico. FNV è dovuto inviarci per essere veloce alternativa al CRC, e si sta dicendo, che la performance non è un problema.

Altri suggerimenti

SHA-2

E 'l'ultimo algoritmo di migliore / hash là fuori. E 'sempre consigliabile andare con algoritmi standard.

Qualsiasi hash crittograficamente forte avrà le proprietà desiderate, ma generano più bit, ma semplice troncamento del risultato a 32 bit sarebbe bene. Presumo forza crittografica non è un requisito reale in modo che viziata (ma ampiamente utilizzati) schemi di hash MD5 come sarebbero adeguati -. E prontamente disponibili in molte biblioteche

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top