在Effective Java中写好hashCode()的指南中,作者提到如果字段是long类型,则需要执行以下步骤:
如果字段是long类型,计算(int)(f^(f>>>32))。
我不明白为什么要这样做。我们为什么要这样做?
如果字段是long类型,计算(int)(f^(f>>>32))。
我不明白为什么要这样做。我们为什么要这样做?
long
是64位的,而int
是32位的。因为hasCode是32位整数值,而long是64位。您需要确保每个long的相同低32位的值具有不同的hashCode,并且此函数应该确保它。
明确一下,您正在将一个64位值哈希成32位。此外,一个好的哈希函数将产生均匀分布的值(出于显而易见的原因!)。
您可以忽略一半的位,但这会使您只剩下一半的可能值产生一个单一的值。因此,在生成哈希码时,您需要以某种方式考虑所有位。
将位混合在一起的选项有:AND、OR、XOR。如果您仔细想想,AND和OR根本不会产生均匀分布的值。XOR可以,所以它是唯一的好选择。
hashCode 返回 int 类型而不是 long 类型。好的 hashCode 算法尽可能让不同的输入得到不同的返回值。
long
类型有多“大”,int
类型有多“大”?然后再想想它们的二进制表示。 ;) - Thomas Jungblut