在编写一个用 Effective java 编写的好 hashCode() 的指南中,如果字段很长,作者提到了以下步骤。
如果字段是长的,则计算 (int) (f ^ (f >>> 32))。
我不明白为什么这样做。我们为什么这样做呢 ?
在编写一个用 Effective java 编写的好 hashCode() 的指南中,如果字段很长,作者提到了以下步骤。
如果字段是长的,则计算 (int) (f ^ (f >>> 32))。
我不明白为什么这样做。我们为什么这样做呢 ?
In Java, a long
is 64-bit, and an int
is 32-bit.
So this is simply taking the upper 32 bits, and bitwise-XORing them with the lower 32 bits.
因为 hasCode 是 32 位整数值和 long 64 位。对于每个 long 具有相同低 32 位的值,您需要 hashCode 不同,并且此函数应确保它。
为了清楚起见,您将 64 位值散列为 32 位值。此外,一个好的散列函数会产生一个均匀分布的值(希望是显而易见的原因!)。
你可以忽略一半的位,但这会让你有一半的可能值产生一个。因此,您希望在生成哈希码时以某种方式考虑所有位。
将这些位混合在一起的选项是:AND、OR、XOR。如果您考虑一下,AND 和 OR 根本不会产生均匀分布的值。XOR 可以,所以它是唯一的好选择。
hashCode 返回一个不长的 int。一个好的 hashCode 算法会尝试为不同的输入设置不同的值。