为什么 String hashCode 方法选择数字31作为乘子

本文探讨了hashCode算法中选择31作为乘子的原因,包括31的性能优势、减少哈希冲突的概率、适中的哈希值范围及溢出风险小等特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章:

hashCode 为什么乘以 31?深入理解 hashCode 和 hash 算法

https://www.jianshu.com/p/76c5215eda5c

为什么 String hashCode 方法选择数字31作为乘子

https://segmentfault.com/a/1190000010799123

为什么在定义hashcode时要使用31这个数呢?

https://blog.youkuaiyun.com/mingli198611/article/details/10062791

 总结:

定义hashcode时要使用31作为乘子主要有以下几个原因:

A、31 有个很好的性能,即用移位和减法来代替乘法,可以得到更好的性能: 31 * i == (i << 5)- i, 现代的 VM 可以自动完成这种优化。

B、31是一个奇素数,选择素数(质数)的好处就是如果我用一个数字来乘以这个素数,那么最终出来的结果也只能被素数本身和被乘数(以及被乘数的整除因子)还有1来整除!这样,以31作为乘子参与乘法计算得出的hashcode值,在后面进行取模(实际上是与运算时),得到相同index的概率会降低,即降低了哈希冲突的概率。

C、31作为一个既不太大又不太小的乘子,计算出来的hashcode值范围处于一个“适中”的区间,能够很好的降低哈希冲突,进行数据查找时可以提高效率。一方面,乘子太小容易导致计算出来的hashcode值范围处于一个“较小”的区间,在后面进行取模(实际上是与运算时),得到相同index的概率会升高,即哈希冲突的概率会提高;另一方面,乘子太大可能会导致相乘时造成数据溢出的概率增大。

D、31只占用5bits(11111B),相乘造成数据溢出的概率较小。

转载于:https://www.cnblogs.com/blogfortang/p/hashcode_31.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值