什么是MurmurHash
MurmurHash简介
MurmurHash是一种非加密散列函数,名称来自两个基本操作,乘法(MU)和旋转(R)。与加密散列函数不同,它不是专门设计为难以被对手逆转,因此不适用于加密目的。在2018年迭代到了MurmurHash3版本,它可以生成32位或128位的哈希值。相较于其他哈希函数,MurmurHash对于规律性较强的 key,它的随机分布特征表现更良好。
优点
- 速度快
缺点
- 不保证安全性
使用方式
google的Guava的工具包提供了其实现。
代码示例
<!-- maven依赖 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
public static void main(String[] args) {
String s = "abcd1";
HashFunction hash1 = Hashing.murmur3_128();
HashCode hashCode = hash1.hashString(s, StandardCharsets.UTF_8);
System.out.println(hashCode.toString());
System.out.println(hashCode.asInt());
System.out.println(hashCode.asLong());
System.out.println(hashCode.hashCode());
}
与加密哈希的速度对比
以下使用md5和murmurHash进行对比。代码示例如下:
public static void main(String[] args) throws NoSuchAlgorithmException {
String s = "abcd1";
int times = 10000000;
murmurTimeTest(times, s);
md5TimeTest(times, s);
}
public static void md5TimeTest(int times, String s) throws NoSuchAlgorithmException {
long startTime = System.currentTimeMillis();
MessageDigest md5 = MessageDigest.getInstance("md5");
for (int i = 0; i < times; i++) {
md5.digest(s.getBytes(StandardCharsets.UTF_8));
}
System.out.println(MessageFormat.format("md5 花费时间:{0} 毫秒", System.currentTimeMillis() - startTime));
}
public static void murmurTimeTest(int times, String s) {
long startTime = System.currentTimeMillis();
HashFunction hash1 = Hashing.murmur3_128();
for (int i = 0; i < times; i++) {
hash1.hashString(s, StandardCharsets.UTF_8);
}
System.out.println(MessageFormat.format("murmurHash 花费时间:{0} 毫秒", System.currentTimeMillis() - startTime));
}
结果
- 1000w次
- 1亿次
可以看到生成的次数越多,时间相差倍数就越大。
总结
murmurHash对于一些不需要加密的场景比较适用,在这类场景下不容易因为hash算法的效率而影响系统的并发量,比如:生成短链接。
什么是MurmurHash的更多相关文章
- MurmurHash算法:高运算性能,低碰撞率的hash算法
MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...
- Nginx源码完全注释(6)core/murmurhash
下面是摘自 Google Code 的 Murmurhash 开源项目主页上的 Murmurhash2,Nginx 就是采用的这个. uint32_t MurmurHash2 ( const void ...
- 浅析ketamahash和murmurhash
说来赶巧,之前我有16个redis集群,然后我要将某个key根据路由规则存到16个集群中的某一个上面,正巧用到了这两种哈希算法,改造完毕上线后,整体带来的效果也十分理想. 说道ketamahash,它 ...
- https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/util/MurmurHash.html
https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/util/MurmurHash.html https://github.com/ ...
- 能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法。尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。
能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法.尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis.MemCa ...
- MurmurHash
public int hash(byte[] data, int length, int seed) { int m = 0x5bd1e995; int r = 24; int ...
- bloom filter + murmurhash
是一种hash方法,其实核心思想就是,将一个字符串通过多个普通hash函数映射到hash表上,然后再进行检索的时候同样计算hash函数,如果全都都hash表上出现过,那么说明有极大的可能出现过,如果没 ...
- 单向HASH——MurmurHash
//seed 是大质数unsigned long long MurmurHash64B ( const void * key, int len, unsigned int seed ) { const ...
- 负载均衡-基础-一致性哈希算法及java实现
一致性hash算法,参考: http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html 针对这篇文章,加入了自己的理解,在原有的代 ...
- 基于redis分布式缓存实现(新浪微博案例)
第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...
随机推荐
- expect tcl 摘录
目录 部分参考来源说明 例子 expect命令 核心命令有三个 spawn.expect.send 其他expect命令 expect命令的选项 变量 tcl摘录 数据类型 符号 命令 其他说明 部分 ...
- 使用 RKE 方式搭建 K8s 集群并部署 NebulaGraph
本文由社区用户 Albert 贡献,首发于 NebulaGraph 论坛,旨在提供多一种的部署方式使用 NebulaGraph. 在本文,我将会详细地记录下我用 K8s 部署分布式图数据库 Nebul ...
- nginx应用及性能调优
1. Nginx 反向代理实现 说反向代理之前 先说什么是正向代理, 正向代理是指客户端通过 代理服务器访问目标服务器,客户端直接访问代理服务器,在由代理服务器访问目标服务器并返回客户端并返回 . 例 ...
- Git 系列:简介安装以及配置管理
目录 简介安装 简介 Centos安装 配置管理 git help 概要 选项 示例 git-doc git config 概要 选项 变量 示例 初始化配置 简介安装 简介 https://git- ...
- vid = two 切开 分开 - 两个眼睛 还有看的含义 - 词根
vid = two 切开 分开 - 两个眼睛 还有看的含义 - 词根 vi = wo acs 构词
- vue-cli-plugin-electron-builder
https://nklayman.github.io/vue-cli-plugin-electron-builder/guide/#installation 用cnpm安装 cnpm install ...
- 补日志log chrome Sources snippet
补日志log chrome Sources snippet var addWindows =$("#table1").children(); var temp = addWindo ...
- OBS无法捕获 chrome、webkit、electron窗口,捕获后黑屏
使用 electron 打包的 pc 应用,用于直播软件推流的 OBS 捕获窗体黑屏 现象:唯独chrome浏览器 edge 浏览器等,其它窗体都正常. 猜测:是由 chromium 内核引起的 修改 ...
- day01-2-@RequestMapping和Rest
@RequestMapping和Rest 1.@RequestMapping 1.1基本使用 @RequestMapping注解可以指定 控制器(处理器) 的某个方法的请求url 1.2@Reques ...
- RTMP录屏直播屏幕数据获取与MediaCodec编码
目录 前言 RTMP直播实现流程 视频采集--MediaProjection 编码--MediaCodec 音频采集--AudioRecord RTMP音频包数据 RTMP视频数据 前言 本文介绍的是 ...