Pregunta

Busco a un algoritmo de hash que produce un número entero 31/32 bits con signo / sin signo como un resumen de una cadena UTF-8 con el propósito de usar la salida para sembrar un PRNG, como por ejemplo un parque-Miller-Carta o LCG un Mersenne-Twister.

He mirado en FNV1 y FNV1a, sino que proporcionan valores muy cercanos de cadenas similares que difieren en su último carácter; Me gustaría tener un hash bajo colisión que cambia radicalmente tras un mínimo de modificaciones en la cadena de entrada. El rendimiento no es un problema.

Mi enfoque actual consiste en un LCG sucia que utiliza códigos de caracteres y un número primo como multiplicadores:

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

Por favor, hágamelo saber de mejores alternativas.

¿Fue útil?

Solución

Si se está generando valor de 32 bits, considere el uso de CRC32 clásico. FNV se suposed ser alternativa rápida a CRC, y que está diciendo que el rendimiento no es un problema.

Otros consejos

Utilice SHA-2

Es el mejor último algoritmo / hash que hay. Siempre es recomendable ir con algoritmos estándar.

Cualquier de hash criptográficamente fuerte tendrá las propiedades que desee, pero generan más bits, pero simple truncamiento del resultado de 32 bits estaría bien. Supongo que la fuerza de cifrado no es un requisito real para que los esquemas de hash defectuosos (pero ampliamente utilizados) como MD5 serían adecuados -. Y fácilmente disponibles en muchas bibliotecas

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top