【发布时间】:2020-02-26 03:06:37
【问题描述】:
我已经开始学习Collections。因此,当我们使用 eclipse 生成 hashcode 时,下面是该方法中存在的公式:
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((pin == null) ? 0 : pin.hashCode());
我搜索并发现由于31 是odd prime,我们在计算hashcode 时使用它。乘以素数可以很好地分布散列码。但是没有遇到任何关于我们为什么使用上述公式以及为什么使用 31 的具体/外行解释。有人可以帮忙详细说明乘以 31 究竟是如何提供更好的哈希码分布的吗?
【问题讨论】:
-
这个想法是每次覆盖
hashCode时都选择一个不同的奇质数,至于为什么是奇质数;它可以更好地在哈希桶中分配密钥。基本上,这是一个重要的实现细节。 -
不仅是素数,还是Mersenne prime,即2^5 - 1 = 11111b,表示重复操作会保留更多位信息。它只是一个方便的数字,具有合理的平均性能。
-
@ElliottFrisch 谢谢,我已经编辑了问题
-
@chrylis-onstrike-,太棒了!!。可以作为答案发布。
-
这能回答你的问题吗? Why does Java's hashCode() in String use 31 as a multiplier? 只需键入“java hash 31”即可将其作为第一个结果。
标签: java collections