java - 实现 hashCode() 的首选方法是什么?

标签 java hashcode

有时我需要通过组合其多个实例成员的 hashCode 来实现 obj 的 hashCode() 方法。例如,如果组合 obj 具有成员 a、b 和 c,我经常看到 ppl 将其实现为


int hashCode(){
   return 31 * 31 * a.hashCode() + 31 * b.hashCode() + c.hashCode();
}

这个神奇的数字 31 从何而来?是 4 个字节的长度还是一个质数?

是否有任何其他首选/标准方法来实现 hashCode()?

最佳答案

参见 Effective Java's recipe .毫无疑问,这是最好的来源。

使用质数只是为了在不知道域的情况下尝试得到一个相当好的分布。溢出到相同的值需要一段时间。如果我没记错的话,值 31 是相当随意的。

根据 Bloch(他使用 17 作为初始值,37 作为常数乘数):

A nonzero initial value is used (...) so the hash value will be affected by initial fields whose hash value (...) is zero. If zero was used as the initial value (...) the overall hash value would be unaffected by any such initial fields, which could increase collisions. The value 17 is arbitrary.
...
The multiplier 37 was chosen because it is an odd prime. If it was even and the multiplication overflowed, information would be lost because multiplication by two is equivalent to shifting. The advantages of using a prime number are less clear, but it is traditional to use primes for this purpose.

关于java - 实现 hashCode() 的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869252/

相关文章:

java - Hadoop 映射器和 reducer 输出不匹配

java - c :forEach loop using direct index versus attributes var and varStatus?

java - 如何检测 equals() 和 hashCode() 是否与类的字段不同步?

java - 当同一程序在 JVM5 和 JVM6 中运行时,HashMap 中的项目顺序不同

Hadoop 的默认分区器 : HashPartitioner - How it calculates hash-code of a key?

java - 使用 JodaTime 计算两个日期之间的月份,记住年份

java - HEROKU - 无法使用 jdk11 部署 java 应用程序

java - 在 Java 中处理多个时区

Java Hashmap 两个相同的对象分开存储

从 0-1 的字符串的 Java 哈希码