13

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

result = 31 * result + ...

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

4

1 回答 1

21

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

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

如果没有任何特别的额外信息,我会坚持这种方法。它相当快,并且很可能最终得到分布合理的哈希码,而且它也很容易做对:)

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

于 2009-07-02T14:01:12.933 回答