string hashcode 解读
偶尔看到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];
}
hash = h;
}
return h;
}
以31为权,每一位为字符的ASCII值进行运算,用自然溢出来等效取模。 ASCII码见 http://blog.csdn.net/lucky_bo/article/details/52247939
哈希计算公式可以计为s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
用31做基础 ,主要是因为31是一个奇质数,所以31*i=32*i-i=(i<<5)-i,这种位移与减法结合的计算相比一般的运算快很多。 参考stackworkflow ,
hashmap的hashcode也是如此
注意上面代码有两个问题:
1.hash码采用int 保存 可能会又重复
System.out.println("ABCDEa123abc".hashCode()); // 165374702
System.out.println("ABCDFB123abc".hashCode()); // 165374702
2.对入具有reverse关系的字符串 会返回相同的hashcode 如: 字符串"gdejicbegh"与字符串"hgebcijedg"具有相同的hashCode()返回值-801038016
这里扩展一下 关于字符串的reverse方法 jdk中提供Stringbuffer的reverse方法 采用unicode代理解决 参考此链接 http://www.importnew.com/501.html
string hashcode 解读的更多相关文章
- 科普:String hashCode 方法为什么选择数字31作为乘子
1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主 ...
- String hashCode 方法为什么选择数字31作为乘子
1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主 ...
- 【转】String hashCode 方法为什么选择数字31作为乘子
某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 hashCode 的实现,发现并不是很复杂.但是我从源码中发现了一个奇怪的数字,也就是本文的主角31.这个 ...
- String hashCode 这个数字,很多人不知道!
作者:coolblog segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashCode 方法.然后大致看了一下 ...
- 科普:为什么 String hashCode 方法选择数字31作为乘子
作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...
- String - 兴趣解读
个优点: . 以下代码的HashCode是否相同,它们是否是同个对象: . 以下代码的HashCode是否相同,他们是否是同个对象: . 以下代码的HashCode是否相同,他们是否是同 ...
- String hashcode的兴趣试玩
今天突然看到Hashcode和equals,==比较时,一时兴起,想了解一下hashcode生成规则,为什么hashcode相同,无法说明对象相等,但用equals说明相同,却可以推出对象的hashc ...
- java String hashCode遇到的坑
在进行数据交换时,如果主键不是整型,需要对字符串,或联合主键拼接为字符串,进行hash,再进行取模分片,使用的是String自带的hashCode()方法,本来是件很方便的事,但是有些字符串取hash ...
- C++———库函数cstring及string方法解读
1.string与cstring区别 <string>是C++标准库头文件.包含了拟容器class std::string的声明(不过class string事实上只是basic_stri ...
随机推荐
- ubuntu 部署wordPress
准备 LAMP 环境 1.安装 Apache2 sudo apt-get install apache2 -y 安装好后,您可以通过访问服务器IP地址 x.x.x.x 查看到 “it works” 界 ...
- 带CookieContainer进行post
1.获取CookieContainer ——用户登录 CookieContainer cookie = new CookieContainer(); UserLoginPost("post地 ...
- Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket
https://blog.csdn.net/a123demi/article/details/78234023 : Springboot集成mybatis(mysql),mail,mongodb,c ...
- js 每隔四位加一个空格
var str = '2016060520103600466'; var str=str.replace(/\s/g,'').replace(/(.{4})/g,"$1 "); a ...
- 通过Jersey客户端API调用REST风格的Web服务
Jersey 客户端 API 基础 要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey .api.client.Client 类的实例.下面是最简单的方法: i ...
- k8s helm 可视化UI 管理工具 monocular部署试用
官方建议是用 helm 进行安装,但是helm 有点费事(各种原因...) 所以使用官方说的使用docker-compose 但是默认官方的compose 跑起来 还是真费事,经过调整,修改了一版支持 ...
- 【转】【iOS】动态更换App图标
原文网址:http://www.cocoachina.com/ios/20170619/19557.html 前言 动态更换App图标这件事,在用户里总是存在需求的:有些用户喜欢“美化”自己的手机.至 ...
- O(n)线性空间的迷宫生成算法
之前所有的迷宫生成算法,空间都是O(mn),时间同样是O(mn),时间上已经不可能更优化, 于是,我就从空间优化上着手,研究一个仅用O(n)空间的生成算法. 我初步的想法是,每次生成一行,生成后立即输 ...
- shell获取目录下所有文件夹的名称并输出
获取指定目录/usr/下所有文件夹的名称并输出: shell代码: #!/bin/bash #方法一 dir=$(ls -l /usr/ |awk '/^d/ {print $NF}') for i ...
- Hadoop和云计算
什么是Hadoop? Hadoop代表的就是基于异步存储(HDFS)的并行计算(Map-Reduce). 首先Hdsf/ Kudu他的存储是分布式的存储,hive(map-reduce).impala ...