Han*_*etz 47 java algorithm hash
我有一系列具有long
字段的对象,其值唯一地标识整个系统中的特定对象,非常类似于GUID.我已经覆盖Object.equals()
了使用这个id进行比较,因为我希望它能够处理对象的副本.现在我想要覆盖Object.hashCode()
,这基本上意味着将我映射long
到一些int
返回值.
如果我理解hashCode
正确的目的 ,它主要用在哈希表中,因此需要均匀分布.这意味着,只需返回id % 2^32
就足够了.这就是全部,还是我应该注意别的什么?
Tof*_*eer 88
从Java 8开始,您就可以使用了
Long.hashCode(guid);
Run Code Online (Sandbox Code Playgroud)
对于旧版本的Java,您可以使用以下内容:
Long.valueOf(guid).hashCode();
Run Code Online (Sandbox Code Playgroud)
请注意,此解决方案为堆栈创建了一个新的Object,而第一个没有(尽管Java可能会优化对象创建...)
查看文档,两种方法都只使用以下算法:
(int)(this.longValue()^(this.longValue()>>>32))
Run Code Online (Sandbox Code Playgroud)
这些都是不错的解决方案,因为它们使用了Java库 - 总是更好地利用已经测试过的东西.
如果你还没有使用Guava,这有点小事,但是Guava可以很好地为你做到这一点:
public int hashCode() {
return Longs.hashCode(id);
}
Run Code Online (Sandbox Code Playgroud)
这给你相当于Long.valueOf(id).hashCode()
:
return (int) (value ^ (value >>> 32));
Run Code Online (Sandbox Code Playgroud)
另外,如果你有其他值或对象是哈希码的一部分,你可以写
return Objects.hashCode(longValue, somethingElse, ...);
Run Code Online (Sandbox Code Playgroud)
该long
会autoboxed成Long
这样你会得到它正确的哈希码作为整个哈希码的一部分.
你已经理解了hashCode
正确的目的.是的,需要均匀分布(尽管不是实际要求).
我建议((id >> 32) ^ id)
.
以上表达式: