一尘不染

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

algorithm

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

如果我hashCode正确理解了目的 ,那么它主要用于哈希表中,因此希望有一个统一的分布。这意味着,仅仅返回id % 2^32就足够了。这是全部,还是我应该知道别的东西?


阅读 273

收藏
2020-07-28

共1个答案

一尘不染

从Java 8开始,您可以使用

Long.hashCode(guid);

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

Long.valueOf(guid).hashCode();

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

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

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

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

2020-07-28