首页 > 编程知识 正文

哈希算法原理和用途(哈希算法特性)

时间:2023-05-06 10:06:58 阅读:80386 作者:258

算法简介

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数据结构的人知道什么意思。

拓展阅读

Redis词典的概念众所周知,词典的基础数据结构通过沉默的百合表实现,沉默的百合算法采用正式的Murmurhash算法。 经常使用redis作为缓存数据库的同学在设置key时,不要将key设置得太长。 否则,会影响性能。 大家可以自己写测试用例,生成不同长度的密钥,读写1000次,看密钥长度对redis性能的影响。 平时,如果需要使用长密钥作为分布式redis锁定较高的并发场景,请考虑使用Murmurhash算法来缩短密钥。 如果涉及未加密的安全要求,请考虑使用它来代替MD5算法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。