java - 高效的 hashCode() 实现

标签 java algorithm data-structures hashmap hashcode

我经常使用 IntelliJ IDEA 自动生成类的 hashCode() 方法,通常该方法采用以下形式:

result = 31 * result + ...

我的问题是乘以 31 的目的是什么?我知道这是一个素数,但为什么要专门选择 31?此外,如果为特别小/大的数据集实现 hashCode(),人们会以不同的方式处理这个问题吗?

最佳答案

乘以 31 很快,因为 JIT 可以将其转换为左移 5 位和减法:

x * 31 == (x << 5) - x

如果没有任何特别的额外信息,我会坚持使用这种方法。它的速度相当快,并且很可能以合理分布的哈希码结束,而且它也很容易正确 :)

数据集的大小并不重要,但如果您有关于您将使用的值的特定额外信息(例如“它总是偶数”),那么您可能能够设计更好的散列函数。不过,我会先等到它成为一个实际问题:)

关于java - 高效的 hashCode() 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074530/

相关文章:

java - 什么是对文件中数百万行整数进行排序的有效算法?

java - 这个 for 循环如何知道这个数组数据结构从一开始有多长?

java - 验证来自添加到数组中的扫描仪的用户输入

c++ - 从四个 std::vector 对象中选择元素最多的一个

java - JAVA 中的大输入

java - In-Memory单表数据库算法或库

algorithm - Excel 使用什么算法重新计算公式?

java - 使用通用自定义类时出现 ClassCastException

java - 无法让 Java 信任我的自签名证书

java - Hibernate项目引用org.hibernate.HibernateException : Unable to get the default Bean Validation factory