为什么hashcode的算法要用31作为乘子

【Java】String hashCode 这个数字 31 1. 背景 原文:String hashCode 这个数字,很多人不知道! 生动有趣的文章:哈希表哪家强?几大编程语言吵起来了! 好文章:面试28k职位,老乡面试官从HashCode到HashMap给我讲了一下午!「回家赶忙整理出1.6万字的面试材料」 建议直接看这个 某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。 这个数字居然不是用常量声明的,所以没法从. 阅读详情

为什么hashcode的算法要用31作为乘子

摘要: 原创出处 https://segmentfault.com/a/1190000010799123 「coolblog」欢迎转载,保留摘要,谢谢!

31乘子讨论

我们先看看 Stack Overflow 上关于这个问题的讨论,Why does Java’s hashCode() in String use 31 as a multiplier?。其中排名第一的答案引用了《Effective Java》中的一段话,这里也引用一下:

The value 31 was chosen because it is an odd prime. If it were even and the multiplication overflowed, information would be lost, as multiplication by 2 is equivalent to shifting. The advantage of using a prime is less clear, but it is traditional. A nice property of 31 is that the multiplication can be replaced by a shift and a subtraction for better performance: `31 * i == (i << 5) - i``. Modern VMs do this sort of optimization automatically.

简单翻译一下:

选择数字31是因为它是一个奇质数,如果选择一个偶数会在乘法运算中产生溢出,导致数值信息丢失,因为乘二相当于移位运算。选择质数的优势并不是特别的明显,但这是一个传统。同时,数字31有一个很好的特性,即乘法运算可以被移位和减法运算取代,来获取更好的性能:31 * i == (i << 5) - i,现代的 Java 虚拟机可以自动的完成这个优化。

排名第二的答案设这样说的:

As Goodrich and Tamassia point out, If you take over 50,000 English words (formed as the union of the word lists provided in two variants of Unix), using the constants 31, 33, 37, 39, and 41 will produce less than 7 collisions in each case. Knowing this, it should come as no surprise that many Java implementations choose one of these constants.

这段话也翻译一下:

正如 Goodrich 和 Tamassia 指出的那样,如果你对超过 50,000 个英文单词(由两个不同版本的 Unix 字典合并而成)进行 hash code 运算,并使用常数 31, 33, 37, 39 和 41 作为乘子,每个常数算出的哈希值冲突数都小于7个,所以在上面几个常数中,常数 31 被 Java 实现所选用也就不足为奇了。

结论

1、31作为乘子可以被计算机优化计算方式为 : 位运算和减法运算 ,加快计算效率。
2、31是一个奇质数,相对来说通过计算的值域空间更符合java语言的int值域。
3、31作为奇质数能降低hash碰撞。

使用海康机器人的SDK进行DWS开发时如何筛选不同类型的相机 使用MVIDCodeReader、MvCodeReaderSDK、MvVolMeasureSDK联合开发时,通常会做一些设备枚举列表,但是不同类型的设备需要枚举在不同的列表中,便于软件使用者配置参数,例如: 如何保证枚举出来的设备是可以选择的对应的设备。我们通常枚举出来的是这样的: 解决办法 在联合开发中,我们发现,只有MvVolMeasureSDK的枚举设备接口EnumStereoCamEx可以正确的只枚举出网络内的体积设备,其余的MVIDCodeReader、MvCodeReaderS 阅读详情

相关推荐

SAP 小结

关于SAP 开发的实习就要告一段落了,从刚开始接触,到现在已经6个月了,想要很简要的把自己对SAP的理解写出来,便于以后查阅(不定期更新)。 1. 什么是SAP? 广义的SAP,可以指代SAP公司以及SAP的各种产品,它的意义要在特定语境下才能确定。一般我们所说的SAP特指SAP ERP。 SAP ERP(enterprise resource planning)是一个企业信息系统。通过这个系

Remy的博客 1951

idea生成的hashCode方法里为什么选择数字31作为生成hashCode值的乘数

idea生成的hashCode方法里选择数字31作为生成hashCode值的乘数的原因详解

m0_69057918的博客 536

基于FPGA低频方波测量-频率与占空比

基于FPGA低频方波测量-频率与占空比

DRAXY的博客 6732

哈希算法之 hashCode 为什么选择数字31作为优质乘子?

选择31的原因是因为,第一是因为是质数减少了哈希冲突,第二就是为什么选择了31呢,因为首先选择其他偏大的质数同时如果存储数据类型是int的话容易导致溢出,如果选择偏小的质数那么容易造成较大概率的哈希冲突,还有一个问题就是为什么不选择31周围的其他数字,比如37和29这些经过测验哈希冲突也不高的质数,就是基于jvm优化考虑的了,因为jvm可以把i*31优化为不含有乘法运算的i<<5 -i,但是如果29和37这些质数就算通过jvm优化之后照样含有乘法运算在里面,所以选择了31 转载:https://

chimycmy的博客 989

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)

8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality

whooiif的博客 1814

树莓派Bookworm系统避坑指南:3种方法解决pip install报错externally-managed-environment

本文详细解析树莓派Bookworm系统中pip install报错externally-managed-environment的成因,并提供三种实用解决方案:使用虚拟环境(venv)隔离项目依赖、通过pipx管理全局Python工具,以及理解风险后的系统安装方法。帮助开发者安全高效地管理Python环境,避免系统冲突。

android的专栏 763

String的HashCode为什么使用 31 作为乘数?

String的HashCode为什么使用 31 作为乘数?String的HashCode为什么使用 31 作为乘数?1、HashCode 源码2、来自 stackoverflow 的回答3、Hash 碰撞概率计算3.1 读取单词字典表3.2 Hash 计算函数3.3 Hash 碰撞概率计算3.4 单元测试4、Hash 值散列分布4.1 哈希值分段存放4.2 单元测试4.2.1 乘数 2 的散列4.2.2 乘数 7 的散列4.2.2 乘数 31 的散列4.2.2 乘数 199 的散列5、总结 String的H

qq5621的博客 716

四足机器人跨楼层轨迹规划:SCAN-Planner-Pure-ROS2开源项目实践指南

在机器人导航领域,路径规划是让机器人从起点安全、高效移动到目标点的核心技术。其原理通常基于环境地图(如占据栅格地图或八叉树地图),通过搜索算法(如A*、RRT*)在配置空间中找到一条无碰撞的可行路径。这项技术的价值在于赋予机器人在复杂、非结构化环境中的自主移动能力,是巡检、救援、物流等应用场景的基石。对于四足机器人而言,其运动能力超越了轮式平台,能在楼梯、斜坡等三维地形中移动,这使得传统的二维规划不再适用,需要专门的三维轨迹规划算法。SCAN-Planner-Pure-ROS2正是这样一个专注于解决四足机器

weixin_30700977的博客 463

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

摘要1. 二进制计算的一些基础知识2. 为什么使用 hashcode3. String 类型的 hashcode 方法4. 为什么大部分 hashcode 方法使用 31...

互扯程序的博客 1万+

8、使用 TPCx - HCI 基准测试表征 HCI 集群的性能和弹性

本文详细介绍了 TPCx - HCI 基准测试,用于衡量超融合基础设施(HCI)集群的性能、稳定性和扩展性。TPCx - HCI 扩展了 TPCx - V 的理念,通过 Tile 架构和弹性特性,全面评估硬件、虚拟化、存储和网络组件的表现。文章还通过多个实验场景分析了负载均衡、数据布局和重新同步策略对性能的影响,并提出了部署和优化 HCI 集群的建议。

sun99的博客 179

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6287

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

参考文章: hashCode 为什么乘以 31?深入理解 hashCode 和 hash 算法 https://www.jianshu.com/p/76c5215eda5c 为什么 String hashCode 方法选择数字31作为乘子 https://segmentfault.com/a/1190000010799123 为什么在定义hashcode时要使用31这个数呢? ...

diguidao9190的博客 283

置顶必读(1) |《滚雪球学 Spring Boot 4.x》专栏目录导航篇(持续更新中)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 8万+

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

作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字...

weixin_30950887的博客 181

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

本文作者:田小波个人博客:http://www.tianxiaobo.com1. 背景某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 has...

tianshouzhi的专栏 273

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

1、源码 首先看下String源码里的hashCode是如何实现的: public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; }

Rsun2018的博客 245

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JDK1.8源码学习-String-hashCode方法为什么选择数字31作为乘子

1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪...

bange7292的博客 264

Java 基础:解析 hashCode

Java 中所有的类都继承自 Object 类,Object 类中有个返回 hashCode 的本地方法。 public native int hashCode(); 复制代码在文档的注释中很清楚的说明了 hashCode 的作用,和它应该满足的一些要求。 作用:给一个对象返回一个 hashCode 值,这个值在 hash table 的数据结构中有重要的作用。例如,确定放置在 hash tab...

weixin_33672109的博客 232

java.lang.String hashCode方法

http://blog.youkuaiyun.com/u014779993/article/details/25740491 主要问题在于为何是加权的。加权值为何选取31,对于元素是有顺序特征的,为什么要保证前缀相同的字符串hash值临近 pre code_snippet_id="343617" snippet_file_name="blog_20140513_1_5190327" name=

dacer2505的专栏 1735

【Java源码分析】String 字符串hashCode

hashCode hashCode() 方法用于返回字符串的哈希码。 字符串对象的哈希码根据以下公式计算: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 使用 int 算法,这里 s[i] 是字符串的第 i 个字符的 ASCII 码,n 是字符串的长度,^ 表示求幂。空字符串的哈希值为 0。 语法 public int hashCode() 参数 无。 返回值 返回对象的哈希码值。 实例 public class Test { public

一片冰心 2203

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

点击上方“程序猿杂货铺”,“星标或置顶公众号”第一时间获取价值内容阅读本文大概需要 15 分钟作者 | coolblog原文地址 | http://www.coolblo...

程序猿杂货铺 379

Java 工程师必知必会的 hashCode 和 hash 算法

本文深入解析Java中hashCode与哈希算法的核心原理与应用。从基础概念出发,详细介绍了hashCode的作用、与equals方法的契约关系,以及如何编写高质量的hashCode方法。重点剖析了HashMap的底层实现,包括扰动函数、下标计算、扩容机制和红黑树优化。文章还探讨了哈希冲突解决策略、性能优化技巧、分布式系统中的一致性哈希,以及安全考量等进阶话题。通过大量源码分析和实战示例,帮助开发者全面掌握哈希算法在Java中的应用,为编写高效、健壮的代码提供理论指导和实践参考。

油墨香^-^的博客 903

hashCode中为什么选择31作为乘子

https://www.cnblogs.com/nullllun/p/8350178.html

weixin_40329367的博客 297

String类源码学习

hashCode()函数这里使用的是Polynomial Hashing, 但是有3个问题1. 为什么不使用mod?2. 对于长字符串,返回值为什么不会超出int的最大允许值?3. 为什么选用31?有什么特别理由吗? public int hashCode() { int h = hash; if (h == 0 &amp;&amp; value.length &g...

yachen28的博客 142

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

www.tianxiaobo.com/2018/01/18/String-hashCode-方法为什么选择数字31作为乘子/ 转载于:https://www.cnblogs.com/zt007/p/10413420.html

136
上一篇: 阿里云对象存储, 服务端签名直传并设置上传回调自定义参数
下一篇: spring-cloud-kubernetes-feign实战
li_a_long
博客等级 码龄9年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值