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

result = 31 * result + ...

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

有帮助吗?

解决方案

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

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

没有任何特别的额外信息,我会坚持这种做法。这是相当快的,而且可能随着还算不错,分布式哈希码结束了,这也很容易得到正确的:)

数据集的大小并不重要,但如果你有关于特定值的额外信息,你就可以用(例如,“它总是甚至”)的工作,那么你的可能的能设计一个更好的散列函数。我会等到它是一个真正的问题,虽然第一次:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top