时间:2011-01-06 19:18:10

标签: php hash integer overflow

1 个答案:

答案 0 :(得分:0)

为什么你认为这些哈希函数需要超过32位? long类型不保证是那么大,它们只是> = 32位。在我的32位平台上long总是32位。

我认为,您链接到的那些注释是在64位不像现在这么流行的时候写的,也是在long long类型之前写的(即使在32位平台上也是> = 64位) )介绍,所以作者只使用了当时可用的最大类型。

“djb2”哈希只是哈希函数的另一种变体,几乎类似于线性同余生成器,并且它已经知道了很长时间。使用溢出替换显式模运算,这实际上是“modulo 2^(sizeof long)”。如果编译为C,那可能(虽然,不确定)对性能有好处,但对于散列质量可能不太好。它在PHP中没有意义,因为这个数字将被提升为double并增长到无穷大。

我建议将散列算法与通常的PHP整数一起使用,但是通过使用divisor添加显式模数来改善散列,divisor是一个小于PHP_INT_MAX的素数(你有没有检查64位构建的限制) PHP,顺便说一句?)。也许,必须更改乘数(33)以获得更好的散列分布以及必须进行散列的字符串。