哈希算法从原理到实战

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希算法从原理到实战相关的知识,希望对你有一定的参考价值。

参考技术A 引言 

       将任意长度的二进制字符串映射为定长二进制字符串的映射规则我们称为散列(hash)算法,又叫哈希(hash)算法,而通过原始数据映射之后得到的二进制值称为哈希值。哈希表(hash表)结构是哈希算法的一种应用,也叫散列表。用的是数组支持按照下标随机访问数据的特性扩展、演化而来。可以说没有数组就没有散列表。

哈希算法主要特点

        从哈希值不能反向推导原始数据,也叫单向哈希。

        对输入数据敏感,哪怕只改了一个Bit,最后得到的哈希值也大不相同。

        散列冲突的概率要小。

        哈希算法执行效率要高,散列结果要尽量均衡。

哈希算法的核心应用

         安全加密 :对于敏感数据比如密码字段进行MD5或SHA加密传输。

         唯一标识 :比如图片识别,可针对图像二进制流进行摘要后MD5,得到的哈希值作为图片唯一标识。

         散列函数 :是构造散列表的关键。它直接决定了散列冲突的概率和散列表的性质。不过相对哈希算法的其他方面应用,散列函数对散列冲突要求较低,出现冲突时可以通过开放寻址法或链表法解决冲突。对散列值是否能够反向解密要求也不高。反而更加关注的是散列的均匀性,即是否散列值均匀落入槽中以及散列函数执行的快慢也会影响散列表性能。所以散列函数一般比较简单,追求均匀和高效。

        *负载均衡 :常用的负载均衡算法有很多,比如轮询、随机、加权轮询。如何实现一个会话粘滞的负载均衡算法呢?可以通过哈希算法,对客户端IP地址或会话SessionID计算哈希值,将取得的哈希值与服务器列表大小进行取模运算,最终得到应该被路由到的服务器编号。这样就可以把同一IP的客户端请求发到同一个后端服务器上。

        *数据分片 :比如统计1T的日志文件中“搜索关键词”出现次数该如何解决?我们可以先对日志进行分片,然后采用多机处理,来提高处理速度。从搜索的日志中依次读取搜索关键词,并通过哈希函数计算哈希值,然后再跟n(机器数)取模,最终得到的值就是应该被分到的机器编号。这样相同哈希值的关键词就被分到同一台机器进行处理。每台机器分别计算关键词出现的次数,再进行合并就是最终结果。这也是MapReduce的基本思想。再比如图片识别应用中给每个图片的摘要信息取唯一标识然后构建散列表,如果图库中有大量图片,单机的hash表会过大,超过单机内存容量。这时也可以使用分片思想,准备n台机器,每台机器负责散列表的一部分数据。每次从图库取一个图片,计算唯一标识,然后与机器个数n求余取模,得到的值就是被分配到的机器编号,然后将这个唯一标识和图片路径发往对应机器构建散列表。当进行图片查找时,使用相同的哈希函数对图片摘要信息取唯一标识并对n求余取模操作后,得到的值k,就是当前图片所存储的机器编号,在该机器的散列表中查找该图片即可。实际上海量数据的处理问题,都可以借助这种数据分片思想,突破单机内存、CPU等资源限制。

        *分布式存储 :一致性哈希算法解决缓存等分布式系统的扩容、缩容导致大量数据搬移难题。

         JDK集合工具实现 :HashMap、 LinkedHashMap、ConcurrentHashMap、TreeMap等。Map实现类源码分析,详见  https://www.jianshu.com/p/602324fa59ac

总结

        本文从哈希算法的原理及特点,总结了哈希算法的常见应用场景。

        其中基于余数思想和同余定理实现的哈希算法(除留取余法),广泛应用在分布式场景中(散列函数、数据分片、负载均衡)。由于组合数学中的“鸽巢”原理,理论上不存在完全没有冲突的哈希算法。(PS:“鸽巢”原理是指有限的槽位,放多于槽位数的鸽子时,势必有不同的鸽子落在同一槽内,即冲突发生。同余定理:如果a和b对x取余数操作时a%x = b%x,则a和b同余)

        构造哈希函数的常规方法有:数据分析法、直接寻址法、除留取余法、折叠法、随机法、平方取中法等  。

        常规的解决哈希冲突方法有开放寻址法(线性探测、再哈希)和链表法。JDK中的HashMap和LinkedHashMap均是采用链表法解决哈希冲突的。链表法适合大数据量的哈希冲突解决,可以使用动态数据结构(比如:跳表、红黑树等)代替链表,防止链表时间复杂度过度退化导致性能下降;反之开放寻址法适合少量数据的哈希冲突解决。

机器学习实战应用案例100篇-蝙蝠算法从原理到实战应用案例

蝙蝠算法(原理)

1 算法简介

蝙蝠是令人着迷的动物。它们是唯一有翅膀的哺乳动物,它们还有先进的回声定位能力

据估计,世界上大约有996种不同的哺乳动物,占哺乳动物种类总数的20%。它们的体型范围从微小的大黄蜂蝙蝠(约1.5到2克)到翼展约2米、体重约1公斤的巨型蝙蝠。微蝠的前臂长度一般为 2.2-11 厘米。

大多数蝙蝠在一定程度上使用回声定位。在所有物种中,微蝠是一个著名的例子,因为微蝠广泛使用回声定位,而巨蝠则不使用。

大多数微蝠是食虫动物。微蝠利用一种叫做回声定位的声纳来探测猎物,躲避障碍物,并在黑暗中找到栖息的缝隙。这些蝙蝠发出非常大的声波脉冲并倾听周围物体反弹回来的回声。

根据物种的不同,它们的脉冲在性质上有所不同,并且可以与它们的捕猎策略相关联。大多数蝙蝠使用短的调频信号扫描大约一个八度,而其他蝙蝠更多地使用恒频信号进行回声定位。它们的信号带宽随种类的不同而变化,通常通过使用更多的谐波来增加带宽。

虽然每个脉冲只持续几千分之一秒(大约8到10毫秒),但是它有一个恒定的频率,通常在[25,150] kHz之间。大多数蝙蝠物种的典型频率范围在[25,100] kHz之间,尽管有些蝙蝠物种可以发射高达150千赫的更高频率。

每次超声波爆发通常持续5到20毫秒,微蝠每秒钟会发出大约10到20次这

以上是关于哈希算法从原理到实战的主要内容,如果未能解决你的问题,请参考以下文章

哈希算法与其应用

windows密码哈希的sam原理

哈希算法现状——原理方法及未来

数据结构与算法哈希算法的原理和应用详解!

Python算法哈希存储哈希表散列表原理

哈希算法原理