我经常使用IntelliJ IDEA自动生成类的hashCode()
方法,通常采用以下形式:
result = 31 * result + ...
我的问题是乘以31的目的是什么?我知道这是一个素数,但为什么选择31?另外,如果为特别小/大的数据集实施hashCode()
,人们会以不同的方式处理这个问题吗?
答案 0 :(得分:21)
乘以31很快,因为JIT可以将其转换为左移5位和减法:
x * 31 == (x << 5) - x
没有任何特别的额外信息,我会坚持这种方法。它的速度相当快,最终可能会得到分布均匀的哈希码,并且很容易做到:)
数据集的大小并不重要,但如果你有关于你将要使用的值的特定额外信息(例如“它总是均匀”)那么你可能能够设计更好的哈希函数。我会等到这是一个真正的问题,但是:)