博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jedis ShardedJedisPool的 HASH一致性算法(一)从String 的hashcode说起
阅读量:6068 次
发布时间:2019-06-20

本文共 1306 字,大约阅读时间需要 4 分钟。

jedis 的shard使用的是算法(一种非),该算法已在nginx,hadoop等开源上使用.

 

回顾String的hashcode()方法

//把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48        char val[] = "111".toCharArray();         int hcode=0;        for (int i = 0; i < val.length; i++) {            hcode = 31 * hcode + val[i];        }

 例如业界最好的字符串hash是times33函数,hash=33*hash+str.charAt(i),不过在JAVA里是把33换成31, 这个是K&R给出的函数

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

在《Effective Java》这本书的第三章提到为什么使用31的原因

from Chapter 3, Item 9: Always override hashcode when you override equals, page 48

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,是因为它是一个奇素数。如果乘数是偶数,因为与2相乘等价于移位运算,并且乘法溢出的话,信息就会丢失。使用素数的好处并不是很明显,但习惯上都是用素数来计算散列结果。31有个很好的特性,即用移位和减法来代替乘法,可以得到更好的性能:31*1==(i<<5)-i)。现代VM可以自动完成这个优化。

不过……,有人指出这个答案是部分错误(The partially wrong answer)在"" 文章中指真正选择31的原因是31是质数,不是因为它是奇数(is because it is prime-not because it is odd.)质数是不能被其他数整除。

 

 

 

 

转载于:https://www.cnblogs.com/treeliang/p/3615729.html

你可能感兴趣的文章
Windows Azure 保留已存在的虚拟网络外网IP(云服务)
查看>>
修改字符集
查看>>
HackTheGame 攻略 - 第四关
查看>>
js删除数组元素
查看>>
带空格文件名的处理(find xargs grep ..etc)
查看>>
华为Access、Hybrid和Trunk的区别和设置
查看>>
centos使用docker下安装mysql并配置、nginx
查看>>
关于HTML5的理解
查看>>
需要学的东西
查看>>
Internet Message Access Protocol --- IMAP协议
查看>>
Linux 获取文件夹下的所有文件
查看>>
对 Sea.js 进行配置(一) seajs.config
查看>>
dom4j解析xml文件
查看>>
第六周
查看>>
斯坦福大学公开课机器学习:梯度下降运算的学习率a(gradient descent in practice 2:learning rate alpha)...
查看>>
解释一下 P/NP/NP-Complete/NP-Hard 等问题
查看>>
javafx for android or ios ?
查看>>
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>