在Java中实现hashcode()函数

3
在Effective Java中写好hashCode()的指南中,作者提到如果字段是long类型,则需要执行以下步骤:

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

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

自己思考一下:long类型有多“大”,int类型有多“大”?然后再想想它们的二进制表示。 ;) - Thomas Jungblut
4个回答

3
在Java中,long是64位的,而int是32位的。
因此,这只是取前32位,并将其与后32位进行按位异或操作。

1

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


1

明确一下,您正在将一个64位值哈希成32位。此外,一个好的哈希函数将产生均匀分布的值(出于显而易见的原因!)。

您可以忽略一半的位,但这会使您只剩下一半的可能值产生一个单一的值。因此,在生成哈希码时,您需要以某种方式考虑所有位。

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


0

hashCode 返回 int 类型而不是 long 类型。好的 hashCode 算法尽可能让不同的输入得到不同的返回值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接