算法简介
Murmur沉默的百合算法是一种非加密型沉默的百合算法,适用于一般沉默的百合搜索操作,由Austin Appleby创立于2008年。所谓非加密型,与追求安全的MD5算法不同,不是专门用于不可逆转的解读,而是追求高性能和低冲突率。 这两个特性在下面进行具体的代码验证。
算法解读
Murmur沉默百合算法的名称由来是其计算过程。 由于需要在沉默的百合过程中多次经历复用和旋转,因此被命名为Murmur。 核心想法是以下代码行(
Murmur3_32在Guava中的实现
可以看到一次处理4个字符的while循环。 对这四个字符执行以下操作:
其中,mixK1的方法如下。
旋转计算出的k1的旋转左方法:
根据计算出的k1执行mixH1方法。
请记住几个重要的变量,即C1、C2、h1和k1。
k1是怎么来的?
INTK1=C0|(C18 )| (c2 16 )|)| (c3 24;
h1是seed,随机数种子可以自己生成,也可以使用默认的。
其中,C1和C2的常数如下。
为什么是这个值呢? 其实都是Austin Appleby经过大量实验计算出的最佳数字。
该算法的核心思想不断强调“k1 *=C1; k1=旋转左(k1,r )”,所以将其命名为“murmurhash”。 那样的话,不是会容易记住一点吗? 或者,被称为陌生百合,陌生人不是总是记得的吗?
实际应用
Murmur算法在Java中有很多具体的实现:Guava上的Hashing :
359 Github.com/Google/Guava/Blob/master/Guava/SRC/com/Google /通用/Hash/murmur3_ 32散列函数.com
Jedis中的MurmurHash :
359 Github.com/Xetorthio/Jedis/Blob/Master/SRC/Main/Java/Redis/Clients/Util/Murmur Hash.Java
Cassandra的MurmurHash (阴影线) :
359 Github.com/Apache/Cassandra/Blob/aa7c 7362 a94dd 3da 81f 521589 CD2 E6 F998 AE 4C1/SRC/Java/Org/Assandrandra
性能测试
比较常用的MD5算法和Murmurhash算法对字符串加密的性能,首先写下对应的两种方法。
测试随机字符串10w次的加密随机生成的100位字符串需要时间:
测试结果:
MD5总时间: 897毫秒
Murmurhash的总时间: 294毫秒
低碰撞率
MurmurHash沉默百合的激烈程度比Java携带的HashCode ()高,高表示低碰撞率,hash表低碰撞率表示更高的性能。
代码将验证Murmurhash和jdk拥有的hashcode的哈希值。
输出如下所示。
对于两个相似的字符串,hashcode的值只相差一位数,但你会发现Murmurhash相差十万八千里。 我想知道hash数据结构的人知道什么意思。