HashCode为什么要用31作为乘数?

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-17 00:38   11   0

在HashMap中hashcode生成的代码中,竟然有一个31的固定值,这是为什么呢,这个咱们可以来看国外大神在stackoverflow上的回答。

其中点赞数最高的是下面这个回答:

这个在理论的高度上做出了解释,好像还是不是很有实战意义,来看第二个呼声最高的回答

这个回答就相当具有实战意义了,只要我们本地准备单词表,就能对31,33,37,39和41这些样本进行逐个测试。

测试结果如图,乘数31,hash碰撞概率到达临界点突然下降很多。但是下面蓝色框内碰撞概率更小,为何不采用呢?原因其实也很简单,因为hashcode算法用到的乘积值越大,随之带来的

就是精度缺失的风险加大。

HashCode算法取31为还可以让数据分布更加散列。直接看代码吧,我们可以本地做个测试

可以看到乘数为31,数据表上凹槽更多,也就说明数据分布较均匀,达到了数据散列的目的,这个在hashmap中的应用,帮助hashmap成为性能极高的数据结构。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP