看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相关推荐

  1. 【华为云技术分享】【一统江湖的大前端】PPT制作库impress.js

    <一统江湖的大前端>系列是笔者的学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.今天要介绍的是大前端PPT制作库impress.js. ...

  2. 一统江湖的大前端React.js-从开发者到工程师

    <一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...

  3. 一统江湖的大前端(7)React.js-从开发者到工程师

    前言:<一统江湖的大前端>系列是自己学习前端笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的 ...

  4. 一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅

    [摘要]<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新. 如果你对前端的理解还是写写页面绑绑事件,那 ...

  5. 一统江湖的大前端(4)shell.js——穿上马甲我照样认识你

    [摘要]<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你 ...

  6. 一统江湖的大前端(3) DOClever——你的Postman有点Low

    [摘要]<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你 ...

  7. 一统江湖的大前端(2)—— Mock.js + Node.js 如何与后端潇洒分手

    <一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...

  8. 一统江湖的大前端(1)——PPT制作库impress.js(含附件)

    <一统江湖的大前端>系列是自己的学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有点O ...

  9. 鸿蒙可能超越安卓吗,华为鸿蒙能超越安卓吗?或一统江湖?任正非已志在必得...

    最近华为鸿蒙2.0已经开放公测,不少华为用户已经开始上手体验了. 据华为消费者业务软件部总裁王成录表示,今年6月初,华为手机就能全面升级鸿蒙2.0系统,而且根据之前的预测,今年华为鸿蒙系统装机量或许可 ...

最新文章

  1. 来,一起手撸一个简版 Redis(附源码)
  2. loadrunner提高篇 - 结果分析实践
  3. python运维之轻松模拟开发FTP软件05
  4. 马斯克的SpaceX又双叒叕融资了:喜提131亿,估值破3000亿
  5. python写程序求1-3+5-7+...-99+101的值-16-Python3-高价函数-提升效率必备
  6. qt调用mysql加密接口_Qt实现客户端/服务器端登录验证|数据传输使用md5加密 | 学步园...
  7. 交通银行软件中心编制_国家标准研究项目区块链服务技术安全要求编制启动会顺利召开...
  8. 2019-03-18-算法-进化(反转链表)
  9. 2019年开源数据库报告发布:MySQL仍卫冕!
  10. wxpython 表格粘贴,wxpython在整个应用程序中剪切复制和粘贴
  11. windows服务器远程关机或重启
  12. 关于background的一些知识
  13. 【PFC】PFC测试指令
  14. android 6.0截屏的实现,android截屏实现
  15. 联咏Novatek_NT98566(对标Sigmastar SSC337)_IMX335单板_IPC模组开发案例
  16. 底部任务栏桌面计算机怎么删除,桌面下方的任务栏总是隐藏怎么办
  17. c语言步长,(转+原创)c语言那些细节之a+1和a+1的区别 ,指针的步长问题。
  18. matlab 花体字母,小论文格式模板.doc
  19. git stash暂存的操作
  20. vi/vim的一些干货命令及快捷键(跳转最后一行,跳转行末等)~舒服!!!

热门文章

  1. 【MySQL数据库开发之一】Mac下配置安装数据库-MySQL
  2. 数据分析之pandas学习笔记(六)(层次化索引、重塑、轴向旋转、行列变换、合并表数据)
  3. PAT刷题集(乙级)1003 我要通过!(20 分)
  4. 小程序 const moment = require('moment')_有C语言程序员说,使用移位操作代替乘除运算效率更高,真的吗?...
  5. Spring中Model,ModelMap以及ModelAndView之间的区别
  6. 上传html网页到后天,【从入门到上岗】web布局篇--html标签
  7. .h文件和.cpp文件组织结构
  8. linux 分区 4k对齐,分区4K对齐那些事,你想知道的都在这里
  9. 算法交易策略的成功回测
  10. acm比赛经验(转)