一、什么是哈希算法
将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而
通过原始数据映射之后得到的二进制值串就是哈希值。
二、哈希算法的要求
从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同;
散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值
三、哈希算法的应用
3.1 安全加密
①常用于加密的哈希算法:
MD5 : MD5 Message-Digest Algorithm , MD5 消息摘要算法
SHA : Secure Hash Algorithm ,安全散列算法
DES : Data Encryption Standard ,数据加密标准
AES : Advanced Encryption Standard ,高级加密标准
②对用于加密的哈希算法,有两点格外重要,第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要小。
③在实际开发中要权衡破解难度和计算时间来决定究竟使用哪种加密算法。
3.2 唯一标识
通过哈希算法计算出数据的唯一标识,从而用于高效检索数据。
3.3 数据校验
利用哈希算法对输入数据敏感的特点,可以对数据取哈希值,从而高效校验数据是否被篡改过。
3.4 散列函数
散列函数中用到的哈希算法更加关注散列后的值能不能平均分布,以及散列函数的执行快慢。1. 负载
3.5 负载均衡
3.5.1 需求
如何实现一个会话粘滞( session sticky )的负载均衡算法?也就是说,在一次会话中的所有请求都路由到同一个服务器上。
3.5.2 解决方案
通过哈希算法对客户端 IP 或会话 ID 计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样,就可以把同一个 IP 过来的请求都路由到同一个后端服务器上。
3.6 分布式存储?
分布式存储就是将数据存储在多台机器上并提供高效的读取、写入支持。那如何决定将哪个数据放到哪个机器上呢?可以利用数据分片的思想,即通过哈希算法对数据取哈希值,然后对机器个数取模,这个最终值就是应该存储的缓存机器编号。
3.6.1 遇到的问题是什么?
如果数据持续增多,原来的机器数量已经不能满足需求,就需要增加机器,这时就麻烦了,因为所有的数据都需要重新哈希值进行再次分配。这就相当于,缓存中的数据一下子都失效了,所有的数据请求都会穿透缓存,直接去请求数据库。这样就可能发生雪崩效应,压垮数据库。
3.6.2 解决方案是什么?
①这时,需要一种方法,使得新加入一个机器后,并不需要做大量的数据搬移。那就是在分布式系统中应用非常广泛的一致性哈希算法。
②一致性哈希算法的基本思想是什么呢?为了说清楚这个问题,我们假设有 k 个机器,数据的哈希值范围是 [0-MAX] ,我们将整个范围划分成 m 个小区间( m远大于 k ),每个机器复杂 m/k 个小区间。当有新机器加入的时候,我们就将某几个小区间的数据,从原来的机器中搬移到新的机器中。这样,既不用全部重新哈希、搬移数据,也保持了各个机器上数据量的均衡