陌生但默默一统江湖的MurmurHash
看Jedis的主键分区哈希时,看到了名字很萌很陌陌的MurmurHash,谷歌一看才发现Redis,Memcached,Cassandra,HBase,Lucene都用它。
关于Hash,我之前只知道MD5,SHA1,SHA256还有Java自己的hashCode(),学校里怎么没教MurmurHash啊? 哦,原来这算法是2008年才被发明的,与MD5这些讲究安全性的摘要算法比,Redis们内部为主键做个Hash而已,就不需要安全性了,因此Google家的MurmurHash这种non-cryptographic的速度会快几十倍。详见Hash 函数概览(State of hash functions)
好了,以后要多用MurmurHash。在Java的实现,Guava的Hashing类里有,上面提到的Jedis,Cassandra里都有Util类。
PS.有些人看到murmur就想到了陌陌就想到了别的,其实是 multiply and rotate的意思,因为算法的核心就是不断的"x *= m; x = rotate_left(x,r);"
Java的HashCode
那Java自己的String的hashCode()呢? 用的是Horner法则, s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
实现上是循环原哈希值×31再加下一个Char的值,算法及其复杂度简单一目了然,连我都能看懂。
for (int i = 0; i < str.length(); i++) { hash = 31*hash + str.charAt[i]; }
注意,int会溢出成负数,再溢成正数,比如"abcde"是 92599395, abcdef"是 -1424385949, "abcdefgh" 是 1259673732
Eclipse的自动代码生成的hashCode()函数也是类似的,循环原哈希值×31,再加下一个属性的hashCode()值。
31有个很好的特性,就是用移位和减法来代替乘法,可以得到更好的性能:31*i==(i<<5)-i。现在的VM可以自动完成这种优化。 Java自己的HashMap,会在调用Key的hashCode()得到一个数值后,用以下算法再hash一次,免得Key自己实现的hashCode()质量太差。
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
那为什么Cassandra们不选简单直白的Horner法则呢?
我猜原因之一是它的性能,有个评测用js来跑的,还是murmur好些。
再猜原因之二它的变化不够激烈,比如"abc"是96354, "abd"就比它多1。而用 murmur"abc"是1118836419,"abd"是413429783。像在Jedis里,它的几个Shard节点的名字就叫做shard-1,shard-2,shard-3而已,hash这几个字符串,murmur的结果还能均匀的落在一致性哈希环上,用Honer法则就不行了。
文章持续修订,转载请保留原链接:http://calvin1978.blogcn.com/articles/murmur.html
陌生但默默一统江湖的MurmurHash相关推荐
- 【华为云技术分享】【一统江湖的大前端】PPT制作库impress.js
<一统江湖的大前端>系列是笔者的学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.今天要介绍的是大前端PPT制作库impress.js. ...
- 一统江湖的大前端React.js-从开发者到工程师
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
- 一统江湖的大前端(7)React.js-从开发者到工程师
前言:<一统江湖的大前端>系列是自己学习前端笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的 ...
- 一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅
[摘要]<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新. 如果你对前端的理解还是写写页面绑绑事件,那 ...
- 一统江湖的大前端(4)shell.js——穿上马甲我照样认识你
[摘要]<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你 ...
- 一统江湖的大前端(3) DOClever——你的Postman有点Low
[摘要]<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你 ...
- 一统江湖的大前端(2)—— Mock.js + Node.js 如何与后端潇洒分手
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
- 一统江湖的大前端(1)——PPT制作库impress.js(含附件)
<一统江湖的大前端>系列是自己的学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有点O ...
- 鸿蒙可能超越安卓吗,华为鸿蒙能超越安卓吗?或一统江湖?任正非已志在必得...
最近华为鸿蒙2.0已经开放公测,不少华为用户已经开始上手体验了. 据华为消费者业务软件部总裁王成录表示,今年6月初,华为手机就能全面升级鸿蒙2.0系统,而且根据之前的预测,今年华为鸿蒙系统装机量或许可 ...
最新文章
- 来,一起手撸一个简版 Redis(附源码)
- loadrunner提高篇 - 结果分析实践
- python运维之轻松模拟开发FTP软件05
- 马斯克的SpaceX又双叒叕融资了:喜提131亿,估值破3000亿
- python写程序求1-3+5-7+...-99+101的值-16-Python3-高价函数-提升效率必备
- qt调用mysql加密接口_Qt实现客户端/服务器端登录验证|数据传输使用md5加密 | 学步园...
- 交通银行软件中心编制_国家标准研究项目区块链服务技术安全要求编制启动会顺利召开...
- 2019-03-18-算法-进化(反转链表)
- 2019年开源数据库报告发布:MySQL仍卫冕!
- wxpython 表格粘贴,wxpython在整个应用程序中剪切复制和粘贴
- windows服务器远程关机或重启
- 关于background的一些知识
- 【PFC】PFC测试指令
- android 6.0截屏的实现,android截屏实现
- 联咏Novatek_NT98566(对标Sigmastar SSC337)_IMX335单板_IPC模组开发案例
- 底部任务栏桌面计算机怎么删除,桌面下方的任务栏总是隐藏怎么办
- c语言步长,(转+原创)c语言那些细节之a+1和a+1的区别 ,指针的步长问题。
- matlab 花体字母,小论文格式模板.doc
- git stash暂存的操作
- vi/vim的一些干货命令及快捷键(跳转最后一行,跳转行末等)~舒服!!!
热门文章
- 【MySQL数据库开发之一】Mac下配置安装数据库-MySQL
- 数据分析之pandas学习笔记(六)(层次化索引、重塑、轴向旋转、行列变换、合并表数据)
- PAT刷题集(乙级)1003 我要通过!(20 分)
- 小程序 const moment = require('moment')_有C语言程序员说,使用移位操作代替乘除运算效率更高,真的吗?...
- Spring中Model,ModelMap以及ModelAndView之间的区别
- 上传html网页到后天,【从入门到上岗】web布局篇--html标签
- .h文件和.cpp文件组织结构
- linux 分区 4k对齐,分区4K对齐那些事,你想知道的都在这里
- 算法交易策略的成功回测
- acm比赛经验(转)