3

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

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

我不明白为什么这样做。我们为什么这样做呢 ?

4

4 回答 4

3

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.

于 2011-11-09T10:49:31.427 回答
1

因为 hasCode 是 32 位整数值和 long 64 位。对于每个 long 具有相同低 32 位的值,您需要 hashCode 不同,并且此函数应确保它。

于 2011-11-09T10:53:45.373 回答
1

为了清楚起见,您将 64 位值散列为 32 位值。此外,一个好的散列函数会产生一个均匀分布的值(希望是显而易见的原因!)。

你可以忽略一半的位,但这会让你有一半的可能值产生一个。因此,您希望在生成哈希码时以某种方式考虑所有位。

将这些位混合在一起的选项是:AND、OR、XOR。如果您考虑一下,AND 和 OR 根本不会产生均匀分布的值。XOR 可以,所以它是唯一的好选择。

于 2011-11-09T10:57:53.273 回答
0

hashCode 返回一个不长的 int。一个好的 hashCode 算法会尝试为不同的输入设置不同的值。

于 2011-11-09T10:57:05.920 回答