O que é um bom algoritmo de hash para semear um PRNG com uma corda?
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.
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