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

参考文章:

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

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

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

https://segmentfault.com/a/1190000010799123

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

https://blog.csdn.net/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),相乘造成数据溢出的概率较小。

 

欢迎关注我的技术公众号,一起成长!

 

posted @ 2019-09-21 00:26  春风十里骚的起  阅读(735)  评论(0编辑  收藏  举报