首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么String中的hashCode()使用31作为乘数?

在Java中,哈希代码用于String对象被计算为

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用int算术,其中s[i]是字符串的i第四个字符,是字符串n的长度,并^指示指数。

为什么31被用作乘数?

我知道乘数应该是一个相对较大的素数。那么为什么不是29,或37,甚至97?

回答 2

嗨喽你好

发布于 2017-12-20 07:44:27

通过相乘,位向左移动。这使用了更多的散列码可用空间,减少了冲突。

通过不使用2的幂,低位,最右边的位也被填充,以与下一个进入散列的数据混合。

表达式n * 31相当于(n << 5) - n。

心愿

发布于 2017-12-20 07:44:16

(大部分)旧的处理器上,乘以31可能会相对便宜。例如在ARM上,它只是一个指令:

代码语言:txt
AI代码解释
复制
RSB       r1, r0, r0, ASL #5    ; r1 := - r0 + (r0<<5)

大多数其他处理器将需要单独的移位和减法指令。但是,如果你的乘数很慢,这仍然是一个胜利。现代的处理器往往有快速的乘法器,所以它没有太大的区别,只要32是正确的一面。

这不是一个很好的哈希算法,但它比1.0代码更好,更好(并且比1.0版本好得多)。

和开发者交流更多问题细节吧,去 写回答
相关文章
为什么String的hashCode选择 31 作为乘子?
某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
Java团长
2019/10/08
1.3K2
为什么String的hashCode选择 31 作为乘子?
为什么String的hashCode选择 31 作为乘子?
某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
用户5224393
2019/10/10
4340
为什么String的hashCode选择 31 作为乘子?
为什么String选择数字31作为hashCode方法乘子?
某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
田守枝
2019/07/02
8670
为什么 String 的 hashCode() 方法使用 31 来计算?
According to Joshua Bloch's Effective Java (a book that can't be recommended enough, and which I bought thanks to continual mentions on stackoverflow):
一个会写诗的程序员
2020/03/25
3900
科普:为什么 String hashCode 方法选择数字 31 作为乘子
某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
芋道源码
2019/10/23
4060
科普:为什么 String hashCode 方法选择数字 31 作为乘子
某天,我在写代码的时候,无意中点开了 String 的 hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角 31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?
周三不加班
2019/06/04
8020
科普:为什么 String hashCode 方法选择数字 31 作为乘子
科普:String hashCode 方法为什么选择数字31作为乘子
某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
田小波
2018/04/29
1.8K11
科普:String hashCode 方法为什么选择数字31作为乘子
科普:String hashCode 方法为什么选择数字31作为乘子
某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
田小波
2019/02/15
4610
面试官问:为什么String的hashCode选择 31 作为乘子?
某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里,请大家带着好奇心和我揭开数字31的用途之谜。
搜云库技术团队
2019/12/06
3310
Why hashcode 31?
本文介绍了hashcode的生成原理,以及为什么使用31作为基数。通过介绍String类中的hashCode方法和普通类的hashCode方法,分析了hashcode的生成方式,并探讨了31作为基数的优点。同时,还列举了普通类覆盖hashCode方法的一些建议,如使用素数、特殊的二进制运算等。
高爽
2017/12/28
1K0
hashCode 为什么乘以 31?深入理解 hashCode 和 hash 算法
5. HashMap 的 hash 算法的实现原理(为什么右移 16 位,为什么要使用 ^ 位异或)
互扯程序
2019/06/14
2.6K0
String.hashcode 源码分析
接触编程这么久了,一直会遇到某些高频词,例如,哈希。hashtable,hashmap,hashset等等等。都有hash一次。那什么是哈希值呢?百度本科解释是,Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。 那是怎么把输入转换成固定长度的散列值呢?我也很好奇。 所以特地找了一下string的hashcode源码。
用户2909867
2018/08/22
3110
为什么要使用String
这段代码总的来说是OK的。该方法将map中每个Dwarable的key和值,以及和它期望被分解的dwarwleKey一同传得给另一个调用方法。因为功能简单,我就不详细描述了。只要了解dwarwle的含义,就能轻易地知道这个方法会干什么。这样的函数简单且具有较好的可读性。但是,这个方法期待参数是一个HashMap,而不是Map。为什么在这里我们会强迫调用者使用HashMap呢?如果调用者出于某种原因需要使用TreeMap,那么是不是还要重新添加另外一个相同的方法来接受TreeMap呢? 当然不是。
哲洛不闹
2018/09/19
3200
为什么要使用String
数据结构:哈希函数的本质及生成方式
说到哈希表,其实本质上是一个数组。通过前面的学习我们知道了,如果要访问一个数组中某个特定的元素,那么需要知道这个元素的索引。例如,我们可以用数组来记录自己好友的电话号码,索引 0 指向的元素记录着 A 的电话号码,索引 1 指向的元素记录着 B 的电话号码,以此类推。 而当这个数组非常大的时候,全凭记忆去记住哪个索引记录着哪个好友的号码是非常困难的。这时候如果有一个函数,可以将我们好友的姓名作为一个输入,然后输出这个好友的号码在数组中对应的索引,是不是就方便了很多呢?这样的一种函数,其实就是哈希函数。哈希函数的定义是将任意长度的一个对象映射到一个固定长度的值上,而这个值我们可以称作是哈希值(Hash Value)。
码农架构
2021/01/22
1K0
数据结构:哈希函数的本质及生成方式
为什么要使用String
最近在培训课期间指导初学者。任务之一就是要大家完成一个类,要求这个类对key为String类型的map执行dwarwle操作。其中一位学员完成的类中,有如下方法: void dwarwle(HashMap<String,Dwarwable> mapToDwarwle, String dwarwleKey){ for( final Entry<String, Dwarwable> entry : mapToDwarwle.entrySet()){ dwarwle(entry.getKey(),entry.
非著名程序员
2018/02/01
4780
使用 int 和 string 作为主键的优劣
【玩转 GPU】AI绘画、AI文本、AI翻译、GPU点亮AI想象空间-腾讯云开发者社区-腾讯云 (tencent.com)
疯狂的KK
2023/07/03
1.7K0
使用 int 和 string 作为主键的优劣
为什么要使用String
这段代码总的来说是OK的。该方法将map中每个Dwarable的key和值,以及和它期望被分解的dwarwleKey一同传得给另一个调用方法。因为功能简单,我就不详细描述了。只要了解dwarwle的含义,就能轻易地知道这个方法会干什么。这样的函数简单且具有较好的可读性。但是,这个方法期待参数是一个HashMap,而不是Map。为什么在这里我们会强迫调用者使用HashMap呢?如果调用者出于某种原因需要使用TreeMap,那么是不是还要重新添加另外一个相同的方法来接受TreeMap呢? 当然不是。
哲洛不闹
2018/09/19
2670
为什么要使用String
为什么要使用String
这段代码总的来说是OK的。该方法将map中每个Dwarable的key和值,以及和它期望被分解的dwarwleKey一同传得给另一个调用方法。因为功能简单,我就不详细描述了。只要了解dwarwle的含义,就能轻易地知道这个方法会干什么。这样的函数简单且具有较好的可读性。但是,这个方法期待参数是一个HashMap,而不是Map。为什么在这里我们会强迫调用者使用HashMap呢?如果调用者出于某种原因需要使用TreeMap,那么是不是还要重新添加另外一个相同的方法来接受TreeMap呢? 当然不是。
哲洛不闹
2018/09/19
2890
为什么要使用String
协程源码中的原子操作为什么使用 AtomicReferenceFieldUpdater?
AtomicReferenceFieldUpdater 比 AtomicReference 用起来稍微有些麻烦,可大佬为什么更喜欢它?
bennyhuo
2020/02/20
6440
hashCode、equals的使用
hash code、equals是Java用来比较对象是否相等,下面介绍一下自己在工作中对hash code、equals的使用. 首先介绍下String类中的hashCode、equals方法:
LiosWong
2018/10/29
5260

相似问题

为什么说String不可变?

2249

31.一般情况下,若磁盘转速提高一倍,则(31)?

033

在C#中,如何使用string.Empty或String.Empty字符串?

2732

String.Format与“String”+“String”或StringBuilder?

2165
相关问答用户
擅长3个领域
平安资管 | 架构师擅长4个领域
擅长4个领域
高级数据分析师擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档