一尘不染

高效的hashCode()实现

algorithm

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

result = 31 * result + ...

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


阅读 207

收藏
2020-07-28

共1个答案

一尘不染

乘以31的速度很快,因为JIT可以将其转换为左移5位并减去:

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

没有任何特殊的额外信息,我会坚持使用这种方法。它相当快,并且可能最终会得到合理分布的哈希码,而且很容易正确实现:)

数据集的大小并不重要,但是,如果您有关于将要使用的值的特定额外信息(例如“它始终是偶数”),则 可以
设计出更好的哈希函数。我会等到它首先成为一个实际问题时才:)

2020-07-28