我经常使用 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/