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));
}

结果

  1. 1000w次

  2. 1亿次

可以看到生成的次数越多,时间相差倍数就越大。

总结

murmurHash对于一些不需要加密的场景比较适用,在这类场景下不容易因为hash算法的效率而影响系统的并发量,比如:生成短链接。

什么是MurmurHash的更多相关文章

  1. MurmurHash算法:高运算性能,低碰撞率的hash算法

    MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...

  2. Nginx源码完全注释(6)core/murmurhash

    下面是摘自 Google Code 的 Murmurhash 开源项目主页上的 Murmurhash2,Nginx 就是采用的这个. uint32_t MurmurHash2 ( const void ...

  3. 浅析ketamahash和murmurhash

    说来赶巧,之前我有16个redis集群,然后我要将某个key根据路由规则存到16个集群中的某一个上面,正巧用到了这两种哈希算法,改造完毕上线后,整体带来的效果也十分理想. 说道ketamahash,它 ...

  4. 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/ ...

  5. 能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法。尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。

    能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法.尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis.MemCa ...

  6. MurmurHash

    public int hash(byte[] data, int length, int seed) {     int m = 0x5bd1e995;     int r = 24;     int ...

  7. bloom filter + murmurhash

    是一种hash方法,其实核心思想就是,将一个字符串通过多个普通hash函数映射到hash表上,然后再进行检索的时候同样计算hash函数,如果全都都hash表上出现过,那么说明有极大的可能出现过,如果没 ...

  8. 单向HASH——MurmurHash

    //seed 是大质数unsigned long long MurmurHash64B ( const void * key, int len, unsigned int seed ) { const ...

  9. 负载均衡-基础-一致性哈希算法及java实现

    一致性hash算法,参考: http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html 针对这篇文章,加入了自己的理解,在原有的代 ...

  10. 基于redis分布式缓存实现(新浪微博案例)

    第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...

随机推荐

  1. [Linux] ubuntu系统使用zfs记录

    关于zfs 之前从B站视频里面了解到了btrfs这个文件系统,说是能够实现cow,然后我第一时间觉得这是个极好的特性,结果后来才发现,使用的时候并不多,而且只能通过cp --reflink的方式使用, ...

  2. Codeforces Round 260 (Div. 1)A. Boredom(dp)

    最开始写了一发贪心wa了,然后这种选和不选的组合优化问题,一般是考虑动态规划 \(dp[i][0]:\)表示第i个数不选的最大值 \(dp[i][1]:\)表示第i个数选的最大值 考虑转移: \(dp ...

  3. RabbitMq 在centos中开机自启动

    1.在/etc/init.d 目录下新建一个 rabbitmq [root@localhost init.d]# vi rabbitmq 文件内容 #!/bin/bash #chkconfig:234 ...

  4. ContextMenuManager右键z 右键菜单

    常用软件 下载 https://files.cnblogs.com/files/pengchenggang/ContextMenuManager右键z-右键菜单.rar?t=1664158084

  5. 基于AmbiqMicro-AMA3B2KK-KBR的可穿戴智能手环解决方案之心率测量源码解析

    一 前记 梳理该可穿戴产品的手环,产品,是一种成长.也是一个总结. 二 源码解析 1 初始化:这里主要初始化心率的检测间隔时间和心率值的位数. /* initialize heart rate pro ...

  6. java基本数据类型及运算的注意事项

    java基本数据类型及运算的注意事项 一.基本数据类型 序号 类型 位数 范围 说明 整数类型 (最高位为符号位) byte 8位 -128(-27)~127(27-1) 默认类型为int 二进制0b ...

  7. Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程)

    Navicat 15 最新破解版下载_永久激活注册码(附图文安装教程) 欢迎关注博主公众号「java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习 ...

  8. Android 8.0 Only fullscreen activities can request orientation解决方法

    原文:Android 8.0 Only fullscreen activities can request orientation解决方法 | Stars-One的杂货小窝 公司的项目坑太多,现在适配 ...

  9. Github+picGo搭建图床(搭配Typora)

    使用Github+picGo搭建图床,保姆级教程来了 - 转载自知乎 (zhihu.com) 1. 注册一个Github账号 首先你需要一个github账号,如果没有的话,先注册. github官网地 ...

  10. exec函数族使用说明

    exec函数不创建新进程,只用磁盘上的程序替换当前进程的正文段.数据段.堆段和栈段.然后从main函数开始运行. exec函数族使用说明 #include <unistd.h> int e ...