mP.*_*mP. 7 algorithm hashcode
这个问题并不是关于为什么人们相乘,这是相当明显的 - 关于分配.
但更重要的是,乘法的一个属性变得更加重要,哈希码计算公式中包含的因子越多.
一个简单的计算显然可能会溢出,但这并不重要.
a * 31 + b
Run Code Online (Sandbox Code Playgroud)
当公式中有许多项目时,就会出现真正的问题.
((a * 31) + b) * 31 ... 6n.
Run Code Online (Sandbox Code Playgroud)
一旦包括超过5或6个项,第一项的值就会丢失,因为当哈希码值达到包含5+项时,其位已溢出.使用这个系统只有最后5个左右的术语才是最终价值的重要贡献者.
31 ^ 7 > Integer.MAX_VALUE
Run Code Online (Sandbox Code Playgroud)
那么为什么大多数计算都不会将溢出的位回滚到xor w /结果的低位.我很欣赏这需要一些小问题,并且必须使用long(64位)进行计算,因此前32位可以与整数结果进行异或,但至少不会丢失任何位.
溢出被忽略有什么特别的原因吗?如前所述,使用很长时间并不昂贵.
编辑
100000*31^7= 2751261411100000 0x9C641F717C560
6553600000*31^7 180306667837849600000 0xC641F717C5600000
Run Code Online (Sandbox Code Playgroud)
请注意,后一个值正好比前一个值大65536倍,这也意味着它的答案大16位.请注意,0xC641F717C5600000的整数值为0xC5600000,实际有效值从16位值丢失.
*SAMPLE A*
65536*4096*27512614111
=7385361114638319616
=0x667E12CDF0000000
12345678
=0xF0000000
*SAMPLE B*
9*65536*4096*27512614111
=66468250031744876544
=0x9A6EA93D70000000
12345678
=0x70000000
Run Code Online (Sandbox Code Playgroud)
请注意,SAMPLE B的最高位(正好是9x SAMPLE A)在最终的32位值中几乎绝对没有差别 - 如果我将9x更改为17x,则低位将是相同的.但是,如果最高位不是由于溢出而"丢失"而xord是由低32位,那么该值将是不同的.
忽略溢出有什么特殊原因吗?如前所述,使用 long 的成本并不高。
但几乎可以肯定的是,这样做不会带来任何好处。这种方法通常首先会产生良好的值分布。