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

2020-11-03 14:12:52 +08:00
 rqxiao

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

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

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

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

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

https://www.v2ex.com/t/721364

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

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

© 2021 V2EX