高效的hashCode()实现

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

 result = 31 * result + ... 

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

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

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

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

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