高效的哈希码()实现

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

result = 31 * result + ...

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


答案 1

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

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

在没有任何特别的额外信息的情况下,我会坚持这种方法。它相当快,并且可能最终得到相当好的分发哈希代码,并且也很容易正确:)

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


答案 2