在编写用Effective java编写的好hashCode()的指南中,如果字段很长,作者会提到以下步骤。
如果字段是long,则计算(int)(f ^(f>>>> 32))。
我无法理解为什么这样做。我们为什么这样做?
答案 0 :(得分:3)
在Java中,long
为64位,int
为32位。
所以这只是取高32位,并用低32位对它们进行逐位异或。
答案 1 :(得分:1)
因为hasCode是32位整数值而且是长64位。对于每个长度相同的低32位值,您需要hashCode不同,此函数应确保它。
答案 2 :(得分:1)
为了清楚起见,您需要将64位值散列为32位值。此外,良好的哈希函数将产生均匀的值分布(原因很明显!)。
你可以忽略一半的比特,但这会让你产生一个单一的可能值的一半。因此,您希望在生成哈希码时以某种方式考虑所有位。
将位混合在一起的选项包括:AND,OR,XOR。如果你考虑一下,AND和OR根本不会产生均匀的价值分布。 XOR确实如此,所以它是唯一的好选择。
答案 3 :(得分:0)
hashCode返回的int不长。一个好的hashCode算法试图为不同的输入提供不同的值。