我应该如何在hashCode()中将long映射到int?
问题内容:
我有一系列对象,这些对象的long
字段的值唯一地标识了整个系统中的特定对象,就像GUID。我已覆盖Object.equals()
使用此ID进行比较,因为我希望它与对象的副本一起使用。现在我也想重写Object.hashCode()
,这基本上意味着将my映射long
到某个int
返回值。
如果我hashCode
正确理解了目的 ,那么它主要用于哈希表中,因此希望有一个统一的分布。这意味着,仅仅返回id % 2^32
就足够了。这是全部,还是我应该知道别的东西?
问题答案:
从Java 8开始,您可以使用
Long.hashCode(guid);
对于较旧版本的Java,可以使用以下命令:
Long.valueOf(guid).hashCode();
请注意,此解决方案为堆栈创建了一个新的Object,而第一个则没有(尽管Java很可能会优化对象创建。)
查看文档,两种方法都只使用以下算法:
(int)(this.longValue()^(this.longValue()>>>32))
这些都是不错的解决方案,因为它们利用了Java库-总是更好地利用已经测试过的东西。