一亿数据,一共花费时间:32秒
一亿数据,每条数据花费时间:323纳秒
本人测试的字符串比较短,也可能是jar包不同版本以及使用的MacOS版本问题,虽然MurmurHash是比MD5快,但没有达到10倍的性能差距。
其它性能测试,含 hutool 包下的MurmurHash.hash64的使用:
package com.yy.armor.engine.core;
import java.nio.charset.StandardCharsets;
import cn.hutool.core.lang.MurmurHash;
import com.google.common.hash.HashFunction;
import com.google.common.hash.Hashing;
import org.springframework.util.DigestUtils;
public class MurmurHashTest {
public static void main(String[] args) {
String hexHashString = getHexHashStringWithGoogle128("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
System.out.println("getHexHashStringWithGoogle128=" + hexHashString);
String hexHashString2 = getHexHashStringWithGoogle32("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
System.out.println("getHexHashStringWithGoogle32=" + hexHashString2);
String hexHashString3 = getHexHashStringWithHutool64("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
System.out.println("getHexHashStringWithHutool64=" + hexHashString3);
String hexHashString4 = getHexMD5String("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
System.out.println("getHexMD5String=" + hexHashString4);
long l = System.nanoTime();
for (int i = 0; i < 10000 * 10000; i++) {
getHexHashStringWithGoogle128("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
long time = System.nanoTime() - l;
System.out.println("一亿数据,getHexHashStringWithGoogle128一共花费时间:" + time / (1000 * 1000 * 1000) + "秒");
long l2 = System.nanoTime();
for (int i = 0; i < 10000 * 10000; i++) {
getHexHashStringWithGoogle32("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
long time2 = System.nanoTime() - l2;
System.out.println("一亿数据,getHexHashStringWithGoogle32一共花费时间:" + time2 / (1000 * 1000 * 1000) + "秒");
long l3 = System.nanoTime();
for (int i = 0; i < 10000 * 10000; i++) {
getHexHashStringWithHutool64("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
long time3 = System.nanoTime() - l3;
System.out.println("一亿数据,getHexHashStringWithHutool64一共花费时间:" + time3 / (1000 * 1000 * 1000) + "秒");
long l4 = System.nanoTime();
for (int i = 0; i < 10000 * 10000; i++) {
getHexMD5String("user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36");
long time4 = System.nanoTime() - l4;
System.out.println("一亿数据,getHexMD5String一共花费时间:" + time4 / (1000 * 1000 * 1000) + "秒");
public static String getHexHashStringWithGoogle128(String str) {
HashFunction hashFunction = Hashing.murmur3_128();
return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();
public static String getHexHashStringWithGoogle32(String str) {
HashFunction hashFunction = Hashing.murmur3_32();
return hashFunction.hashString(str, StandardCharsets.UTF_8).toString();
public static String getHexHashStringWithHutool64(String data) {
long hash64 = MurmurHash.hash64(data);
return Long.toHexString(hash64);
public static String getHexMD5String(String str) {
return DigestUtils.md5DigestAsHex(str.getBytes());
getHexHashStringWithGoogle128=3f3d5e5f32f9fff6a34dfa6329a83bf7
getHexHashStringWithGoogle32=2cb92c51
getHexHashStringWithHutool64=4742386bfc5110a8
getHexMD5String=05fbb1053d692f9f6730d1a24e577a92
一亿数据,getHexHashStringWithGoogle128一共花费时间:36秒
一亿数据,getHexHashStringWithGoogle32一共花费时间:19秒
一亿数据,getHexHashStringWithHutool64一共花费时间:18秒
一亿数据,getHexMD5String一共花费时间:62秒
MurmurHash是一种非加密的高效哈希函数,由 Austin Appleby 开发。它主要用于哈希表和数据分布等场景。Base62编码是一种将数据压缩成更短字符串的编码方式,它使用 62 个字符:0-9、A-Z 和 a-z。Base62 编码广泛用于生成简短、可读性强的标识符。通过结合使用MurmurHash和Base62编码,我们可以高效生成短链接,解决长 URL 带来的不便。这种方法不仅适用于 URL 缩短,还可以广泛应用于生成唯一标识符和缓存键等场景。
一致性哈希提出了在动态变化的Cache环境中,哈希算法应该满足的4个适应条件:
平衡性(Balance)
平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
单调性(Monotonicity)
单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的
MurmurHash2是一种广泛使用的非加密哈希函数,由Austin Appleby在2008年设计。它旨在提供高速的哈希计算,同时保持较低的碰撞率。MurmurHash的名字来源于两个操作:“乘法(multiply)”和“旋转(rotate)”,这两个操作是算法的核心部分。MurmurHash算法有几个版本,MurmurHash2是其中的一个版本,其它版本包括MurmurHash1、MurmurHash3等。高性能:它非常快,尤其是对小数据块的哈希计算,这使得它非常适合用于哈希表等数据结构。分布均匀。
MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。 由Austin Appleby在2008年发明, 并出现了多个变种,都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。—摘自w...
MurmurHash是一种高效、分布均匀且广泛应用的非加密哈希函数。它在数据处理和存储的多个领域都有着重要的应用,尤其适合那些对性能有高要求的场景。然而,需要注意的是,MurmurHash不适用于安全敏感的应用。
1.数据库中索引概念
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
2.索引优点和缺点
索引可以避免全表扫描,加快查询速度。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有...
MurmurHash 是一种高性能的哈希算法,由 Austin Appleby 在 2008 年创建。它是一种非加密哈希算法,可以快速地计算出任意数据的哈希值。MurmurHash 算法的特点是快速、高效、低碰撞、低冲突,适用于各种哈希表、哈希集合、哈希映射等数据结构。它的哈希值分布均匀,哈希冲突率低,能够更好地处理哈希碰撞和哈希冲突。MurmurHash 算法的原理是将输入数据分成若干个块,每个块都使用不同的哈希函数计算出一个哈希值,然后将这些哈希值进行混合和运算,得到最终的哈希值。
Murmurhash: 是一种非加密型哈希函数,适用于一般的哈希检索操作。高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc++、nginx、libmemcached等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的CityHash算法。
一致性哈希算法的主要步骤:
首先求出缓存服务器结...
MurmurHash是一种高效的非加密哈希函数,适用于哈希表中的一般哈希任务。MurmurHash的名称来源于Murmur,意为一种低频的声音,体现了其设计的低碰撞率和高性能。名称来自两个基本操作,乘法(MU)和旋转(R),在其内部循环中使用。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。MurmurHash与加密散列函数不同,它不是专门设计为难以被对手逆转,因此不适用于加密目的。
加密哈希和非加密哈希-MM是非加密哈希
首先了解下加密哈希和非加密哈希,
加密哈希函数旨在保证安全性,很难找到碰撞。即:给定的散列h很难找到的消息m;很难找到产生相同的哈希值的消息m1和m2。
非加密哈希函数只是试图避免非恶意输入的冲突。作为较弱担保的交换,它们通常更快。如果数据量小,或者不太在意哈希碰撞的频率,甚至可以选择生成哈希值小的哈希算法,占用更小的空间。
Smhasher-评价哈希算法的...
Murmur哈希是一种非加密函数的哈希函数,下面我们在介绍哈希函数之前我们需要了解一下什么是好的哈希函数。
1.好的哈希函数应该卡方测试(chi-squared test)
卡方测试:
Xc2=∑i=0N−1(Oi−Ei)2/Ei,其中Oi为观察量,而Ei为估计量{X_c^2 = \sum_ {i=0}^{N-1}(O_i-E_i)^2/E_i},其中O_i为观察量,而E_i为估计量Xc2=∑i=0N−1(Oi−Ei)2/Ei,其中Oi为观察量,而Ei为估计量
我们测试的方案就是给出大量的数据