HashMap中的Hash方法

HashMap中的Hash方法,第1张

HashMap中的Hash方法

设计通用哈希码的问题之一是,您将所有这些工作都放在了确保良好的位扩展上,然后有人来使用并以完全撤消的方式使用它。

让我们以一个带有X和Y(均为整数)的坐标类的经典示例为例。

这是一个经典的示例,因为人们会用它来证明这

X ^ Y
不是一个很好的哈希码,因为通常会有多个对象,其中
X == Y
(所有哈希都为0)或X和Y为Y和X的对象其他(将散列相同)和其他情况下,我们最终得到相同的散列码。

归结为一个事实,虽然整数的可能范围涵盖40亿个值,但在99%的使用中,它们最多最多不到几百或几万。我们永远无法避免尝试在40亿个可能的结果中分散18个四十亿可能的值,但是我们可以努力使我们实际看到的值减少冲突的可能性。

现在,

(X << 16 | X >> 16) ^
Y在这种情况下做得更好,将来自X的位分散更多。

不幸的是,如果使用此哈希

% someBinaryRoundNumer
来索引表(甚至
% someOtherNumber
在较小程度上),则对于低于X的值(
someBinaryRoundNumber
我们可以预期是最常见的),此哈希有效return Y。

我们所有的辛苦工作被浪费了!

所使用的重新哈希方法是使用这种逻辑进行哈希方法,效果略好。

值得一提的是,过于批评这种

(X << 16 | X >> 16) ^ Y
方法是不公平的,因为对哈希的另一种使用可能具有优于给定替代方法的形式。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5586785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存