用字符串播种prng的好散列算法是什么?

时间:2009-03-24 15:45:54

标签: string hash seed prng

我正在寻找一种散列算法,它产生一个31/32位有符号/无符号整数作为utf8字符串的摘要,目的是使用输出来播种prng,例如Park-Miller-Carta LCG或Mersenne-Twister。

我已经研究了FNV1和FNV1a,但它们为类似字符串提供了非常接近的值,这些字符串的最后一个字符不同;我希望有一个低冲突哈希值,根据输入字符串的最小修改从根本上改变。表现不是问题。

我目前的方法是使用一个脏的LCG,它使用字符代码和素数作为乘数:

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

请让我知道更好的选择。

3 个答案:

答案 0 :(得分:3)

使用SHA-2

这是最好的/最新的哈希算法。始终建议使用标准算法。

答案 1 :(得分:1)

如果您正在生成32位值,请考虑使用经典CRC32。 FNV是CRC的快速替代品,你说,性能不是问题。

答案 2 :(得分:1)

任何加密强哈希将具有您想要的属性,但会生成更多位,但将结果简单截断为32位就可以了。我认为加密强度不是实际要求,因此像MD5这样有缺陷(但广泛使用)的哈希方案就足够了 - 并且很容易在许多库中使用。