高效的hashCode()实现

时间:2009-07-02 14:00:43

标签: java algorithm data-structures hashmap hashcode

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

result = 31 * result + ...

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

1 个答案:

答案 0 :(得分:21)

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

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

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

数据集的大小并不重要,但如果你有关于你将要使用的值的特定额外信息(例如“它总是均匀”)那么你可能能够设计更好的哈希函数。我会等到这是一个真正的问题,但是:)