Java中 String 字符串哈希值计算公式 s[0]*31^(n-1) 怎么理解

星磊小哥_4835

星磊小哥_4835

2026-07-17

848人浏览

原创

java string.hashcode()的哈希值是通过以31为底的加权和计算的确定性整数,公式为s[0]×31^(n−1)+…+s[n−1]×31^0,实际采用霍纳法迭代h=31×h+char实现,31因是奇质数且支持位运算优化(31×h等价于(h

java中 string 字符串哈希值计算公式 s[0]*31^(n-1) 怎么理解

这个公式是 Java String.hashCode() 的数学表达形式,本质是把字符串看作一个以 31 为底的“数字”,每个字符是某一位上的“数字”,位置越靠前权重越高。

它不是真算幂,而是霍纳展开

公式写成 s[0]×31^(n−1) + s[1]×31^(n−2) + … + s[n−1]×31^0 看似要算很多次方,但实际代码里从不这么算。JVM 用的是等价的迭代方式:

  • 从左到右遍历每个字符
  • 每步执行 h = 31 * h + currentChar
  • 初始 h = 0

比如 "ab"('a'=97, 'b'=98): 第一步:h = 31×0 + 97 = 97 第二步:h = 31×97 + 98 = 3105 这和直接算 97×31¹ + 98×31⁰ = 3105 完全一致——只是避免了大指数和重复计算。

为什么首字符乘的是 31^(n−1)

因为字符串越长,前面字符的影响被放大得越多。这带来两个实际效果:

  • 前缀相同的字符串(如 "abc" 和 "abcd")哈希值通常接近,利于 HashMap 中桶的局部性
  • 微小改动(比如改第一个字符)会显著改变结果,降低冲突概率

反过来看,末尾字符只乘 1,影响最小——这也是为什么两个互为反转的字符串(如 "gdejicbegh" 和 "hgebcijedg")偶尔会撞出相同 hash 值。

js2java
js2java

JavaScript 到 Java 全栈翻译助手,专为前端开发者学习 Java 或快速实现后端业务逻辑而设计。当用户提到以下场景时必须使用此技能: - "帮我把这段 JS 代码转成 Java" - "用 Java 怎么写这个逻辑" - "我习惯用 JS 写,想翻译成 Java" - "教我 Java,我要写后端接...

下载

31 不是 magic number,而是权衡选择

选 31 主要出于三点考虑:

  • 它是奇质数,能减少因字符组合相似导致的哈希重复
  • 31 * h 可优化为 (h ,位运算比乘法快
  • 数值适中:太大容易溢出失真,太小又离散性差;实测在常见字符串分布下,31 比 29、37 等略优

所有运算都在 int 范围内进行,溢出不报错,而是自然回绕——这反而保证了结果确定性。

空串和单字符是公式的自然结果

公式本身已涵盖边界情况:

  • 空串 "":长度 n=0,求和项为空 → hash=0
  • 单字符如 "x":n=1,只有 s[0]×31⁰ = s[0] → hash 就是字符的 Unicode 值

不需要额外判断,代码里循环不执行就直接返回初始值 0,完全契合数学定义。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10357

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7482

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6552

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1124

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

928

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1356

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2729

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20031

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1215

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习