在java中实现hashcode()

时间:2011-11-09 10:46:50

标签: java hashcode effective-java

在编写用Effective java编写的好hashCode()的指南中,如果字段很长,作者会提到以下步骤。

  

如果字段是long,则计算(int)(f ^(f>>>> 32))。

我无法理解为什么这样做。我们为什么这样做?

4 个答案:

答案 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算法试图为不同的输入提供不同的值。