1.8 Hashmap 里的 hash 方法是什么意思呢

2020 年 11 月 3 日
 rqxiao

return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

网上说是让这个 key 可以更加分散?

让原本的 hashcode 和 原本 hashcode 无符号右移 16 位 进行一次异或

2709 次点击
所在节点    Java
3 条回复
ex1gtnim7d
2020 年 11 月 3 日
扰动函数,将高位和地位做异或,主要是为了让所有二进制位都能进来参与运算,增加随机性,使得散列的效果更好
SoloCompany
2020 年 11 月 3 日
因为桶的数量通常不会超过 65536, 异或一下减少高位信息熵的浪费
AllanAG
2020 年 11 月 3 日
在这个方法中将 key 的 hashcode 右移 16 位,然后按位异或。异或算法是相同为 0,不同为 1 。
右移 16 位以后,原来的高 16 位就到了低 16 位上,再与原来的数异或,就相当于高 16 位与低 16 位异或。
因此 hash 算法的作用就是高 16 位不变,低 16 位和高 16 位做异或。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/721364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX