你能解释一下所谓的Java标准计算哈希码的方法吗?

时间:2012-06-13 09:43:45

标签: java math hashcode

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

Java开发人员似乎对以下方法有所了解:

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

这可能是简单的算术,但我并没有真正得到它。什么是保证?角落案件有哪些?是否有更好(相当简单)的方法呢?

谢谢!

3 个答案:

答案 0 :(得分:2)

这是关于主要因素。看看this answer

如果你只是在寻找快速方式和实用的方法,并且你对性能没有任何重大关注,请查看Apache Commons Lang HashCodeBuilder或类似的库函数。 equals有一个equivalent builder

答案 1 :(得分:2)

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

  

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

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

答案 2 :(得分:1)

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

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