1

我最近必须重写 Java 中的equalsandhashCode方法。因此,我寻找一种快速有效的方法来计算哈希码。

Java 开发人员似乎同意以下方法:

    int hash = 23;
    hash = hash * 37 + paramOne;
    hash = hash * 37 + paramTwo;
    // And so on...

这可能是简单的算术,但我真的不明白。有什么保证?什么是极端情况?有没有更好(相当简单)的方法来做到这一点?

谢谢 !

4

3 回答 3

2

hashCode() 用 Joshua Bloch 的话来说(解释类中方法的默认实现String,即 : s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]):

选择值 31 是因为它是一个奇数素数。如果它是偶数并且乘法溢出,则信息将丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。31 的一个很好的特性是乘法可以用移位和减法代替以获得更好的性能:31 * i == (i << 5) - i。现代虚拟机自动进行这种优化。

如需进一步阅读,请参阅thisthis

于 2012-06-13T09:50:05.063 回答
2

这是关于主要因素的。看看这个答案

如果您只是在寻找一种快速且实用的方法,并且您对性能没有重大顾虑,请查看 Apache Commons Lang HashCodeBuilder或类似的库函数。有一个等效的构建equals

于 2012-06-13T09:47:27.763 回答
1

Joshua Bloch 在他的“Effective Java”的第 3 章中告诉您如何正确地覆盖 equals 和 hashCode。谷歌它并阅读它。

他是集合 API 的编写者,现在是 Google 的首席 Java 架构师。这对我来说已经足够权威了。

于 2012-06-13T09:46:58.523 回答