一、介绍

MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法。

Java界中Redis,Memcached,Cassandra,HBase,Lucene都用它。

在Java的实现,Guava的Hashing类里有,上面提到的Jedis,Cassandra里都有Util类。

但存在的问题是由于Java的数据类型long与C语言中无符号长整型uint64_t有区别,导致Java输出版本存在负数,针对这个问题进行了修改;另外需要注意的是中文不同编码(UTF-8或GBK)会导致输出结果的不同,使用中需要统一编码。

二、原理

算法图例

三、性能测试对比

import java.nio.charset.StandardCharsets;
import org.apache.commons.codec.digest.DigestUtils;
import com.google.common.hash.Hashing;public class Test {public static void main(String[] args) {System.out.println(murmur3Test("334324324234234sfsfsdfwwrtregreg"));long startTime=System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {Test.md5Test("KFETHGRETWERFSDFWEFWEFWF");}long endTime=System.currentTimeMillis();System.out.println("1000万次md5Test算法程序运行时间: " + (endTime - startTime ) + "ms");long startTime2=System.currentTimeMillis();for (int i = 0; i < 10000000; i++) {Test.murmur3Test("KFETHGRETWERFSDFWEFWEFWF");}long endTime2=System.currentTimeMillis();System.out.println("1000万次murmur3Test算法程序运行时间: " + (endTime2 - startTime2 ) + "ms");}public static String murmur3Test(String primaryKey) {return Hashing.murmur3_32().hashString(primaryKey, StandardCharsets.UTF_8).toString() + "_" + primaryKey;}public static String md5Test(String primaryKey) {return DigestUtils.md5Hex(primaryKey)+ "_" + primaryKey;}}

输出:

539aa3e7_334324324234234sfsfsdfwwrtregreg
1000万次md5算法程序运行时间: 4420ms
1000万次murmur3Test算法程序运行时间: 1902ms

结论:

MurmurHash算法比md5快一倍。

四、使用场景

1、根据uuid,通过hash算法进行取模分库分表

2、用来计算出key的slot值

3、短链接

五、其他算法

ketamahash一致性哈希算法

由若干固定的虚拟节点来计算出每个虚拟节点的slots,数据存储的时候,算出key的slot值,然后存入相邻最近的虚拟节点

hash函数MurmurHash相关推荐

  1. Hash 函数资源链接汇总

    Hash 链接: [1]General Purpose Hash Function Algorithms:http://www.partow.net/programming/hashfunctions ...

  2. hash函数的简单介绍

    HASH函数 应用Hash函数 作者:冲处宇宙 时间:2007.1.25 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的 ...

  3. Hash函数的安全性

    我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题. 三个概念: 1.如果y<>x,且h(x)=h(y),则称为碰撞. 2.对于给定 ...

  4. HashMap中的hash函数

    在写一个HashSet时候有个需求,是判断HashSet中是否已经存在对象,存在则取出,不存在则add添加.HashSet也是通过HashMap实现,只用了HashMap的key,value都存储一个 ...

  5. 文本去重之MinHash算法——就是多个hash函数对items计算特征值,然后取最小的计算相似度...

    来源:http://my.oschina.net/pathenon/blog/65210 1.概述 跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHas ...

  6. Cuckoo hash算法分析——其根本思想和bloom filter一致 增加hash函数来解决碰撞 节省了空间但代价是查找次数增加...

    基本思想: cuckoo hash是一种解决hash冲突的方法,其目的是使用简单的hash 函数来提高hash table的利用率,同时保证O(1)的查询时间 基本思想是使用2个hash函数来处理碰撞 ...

  7. Hash函数及其应用

    本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数 ...

  8. 常见的一些 Hash 函数

    Hash的主要原理就是把大范围映射到小范围:所以,你输入的实际值的个数必须和小范围相当或者比它更小.不然冲突就会很多. 不同的应用对Hash函数有着不同的要求:比如,用于加密的Hash函数主要考虑它和 ...

  9. 认知理论与技术(hash函数,SHA,MD

    概述: 认证是个过程,通过这个过程一个实体向另一个实体证明某种声称的属性 认证参数: "口令"相当于平时登录系统时输入的密码. "密钥"相当于公钥密码体制中的私 ...

最新文章

  1. 牛客网【每日一题】5月8日题目精讲 codeJan与旅行
  2. 完整的WebApplication JSF EJB JPA JAAS –第2部分
  3. leetcode 872. 叶子相似的树(dfs)
  4. 【转】卷积的本质及物理意义(全面理解卷积)
  5. 国科大prml14-独立于算法的机器学习(boosting/
  6. 交易引擎的对账状态为空的处理方式
  7. Flask中那些特殊的装饰器
  8. centos7部署posgresql和kong总结
  9. Git显示漂亮日志的小技巧
  10. iframe页面使用Js实现父页面和子页面通信
  11. Linux系统-Ubuntu的下载和安装
  12. 华为NP课程笔记24-BFD
  13. 2023年计算机网络考研真题详解
  14. mac安装telnet命令
  15. js获取当前服务器信息,js获取当前URL、参数、端口、IP等服务器信息
  16. html 表格 分页源码,JS代码实现table数据分页效果
  17. 手机h5像素_拍照超逆天!华为P30大奖来袭 | 4000万像素+50倍变焦,漳州手机摄影界真要沸腾了......
  18. 配置管理工作职责思考
  19. 不可不学的摄影技巧.1—构图
  20. 百度地图小区边界爬取

热门文章

  1. java.securti_springboot集成springsecurity 使用OAUTH2做权限管理的教程
  2. vs code linux 权限,在linux系统中安装VSCode(Visual Studio Code)
  3. 技术突破寻找新思路,互联网内容的风控与风口
  4. 小冰与老东家微软达成战略合作,并宣布数亿元Pre-A轮融资,将全面开展商业化
  5. 低代码已至,传统开发方式是否还有必要?
  6. 字节跳动斩获支付牌照欲建金融帝国,技术实力配得上野心吗?
  7. 600岁故宫插上科技翅膀 技术与营销的「双刃剑」?
  8. 微软想让所有人都成为开发者?
  9. 详解 URLLC 前世今生,你 Get 了吗?
  10. 还在这样学 Python?怪不得白费力!