Pergunta

Eu estou procurando um algoritmo de hash que produz um 31/32 bits assinado inteiro sem sinal / como uma digerir para uma string utf8 com a finalidade de usar a saída para semear um PRNG, como um Park-Miller-Carta LCG ou um Mersenne-Twister.

Eu olhei em FNV1 e FNV1a, mas eles fornecem valores muito próximos para cordas semelhantes diferindo em seu último personagem; Eu gostaria de ter um hash baixo colisão que muda radicalmente mediante modificações mínimas na cadeia de entrada. O desempenho não é um problema.

Minha abordagem atual consiste em uma LCG sujo que códigos de caracteres usos e um número primo como multiplicadores:

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

Por favor, deixe-me saber de quaisquer alternativas melhores.

Foi útil?

Solução

Se você está gerando valor de 32 bits, considere usar CRC32 clássico. FNV é suposto ser rápido alternativa para CRC, e você está dizendo, que o desempenho não é um problema.

Outras dicas

Use SHA-2

É a melhor mais recente algoritmo / hashing lá fora. É sempre aconselhável para ir com algoritmos padrão.

Qualquer de hash criptograficamente forte terá as propriedades que deseja, mas gerar mais bits, mas simples truncamento do resultado para 32 bits seria ótimo. Presumo força criptográfica não é um requisito real para que falho (mas amplamente utilizado) esquemas de hash MD5 como seria adequada -. E prontamente disponível em muitas bibliotecas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top