我应该如何在 hashCode() 中将 long 映射到 int?

2022-08-31 19:46:57

我有一系列对象,这些对象具有一个字段,其值唯一地标识整个系统中的特定对象,就像 GUID 一样。我已经覆盖了使用此id进行比较,我希望它与对象的副本一起使用。现在我也想覆盖,这基本上意味着将我映射到某个返回值。longObject.equals()Object.hashCode()longint

如果我正确地理解了其目的,它主要用于哈希表,因此均匀分布将是可取的。这意味着,只需返回就足够了。仅此而已,还是我应该意识到其他事情?hashCodeid % 2^32


答案 1

从Java 8开始,您可以使用

Long.hashCode(guid);

对于较旧版本的 Java,您可以使用以下命令:

Long.valueOf(guid).hashCode();

请注意,此解决方案为堆栈创建了一个新对象,而第一个解决方案则不会(尽管 Java 可能会优化对象创建。

查看文档,两种方式都只需使用以下算法:

(int)(this.longValue()^(this.longValue()>>>32))

这些都是不错的解决方案,因为它们利用了Java库 - 总是更好地利用已经过测试的东西。


答案 2

如果您还没有使用番石榴,这是一件小事,但是番石榴可以很好地为您做到这一点

public int hashCode() {
  return Longs.hashCode(id);
}

这相当于:Long.valueOf(id).hashCode()

return (int) (value ^ (value >>> 32));

此外,如果您有其他值或对象是哈希码的一部分,则可以编写

return Objects.hashCode(longValue, somethingElse, ...);

将自动装箱到 a 中,以便您获得正确的哈希码作为整体哈希码的一部分。longLong