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