答案 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)以获得更好的散列分布以及必须进行散列的字符串。