特点
将任意⻓度的二进制值串映射为固定⻓度的二进制值串,这个映射的规则就是哈希算法
而通过原始数据映射之后得到的二进制值串就是哈希值
优秀的哈希算法前提条件
从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)
对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同
散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小
哈希算法的执行效率要尽量高效,针对较⻓的文本,也能快速地计算出哈希值
最常见应用场景
安全加密
最常用于加密的哈希算法是
MD5(MD5消息摘要算法)、SHA(安全散列算法)
DES(数据加密标准)、AES(高级加密标准)
哈希算法四点要求,对用于加密的哈希算法来说,有两点格外重要
从哈希值不能反向推导出原始数据
散列冲突的概率要很小
为什么哈希算法无法做到零冲突?
哈希算法产生的哈希值的⻓度是固定且有限的
根据一个MD5哈希值,通过毫无规律的穷举,找到相同MD5值的另一个数据
但耗时非常长,应该是个天文数字
即便哈希算法存在冲突,但在有限的时间和资源下,哈希算法还是被很难破解的
唯一标识: 哈希算法可以对大数据做信息摘要,通过一个较短的二进制编码表示很大的数据
数据校验: 用于校验数据的完整性和正确性
散列函数: 更加关注散列的平均性和哈希算法的执行效率
负载均衡
负载均衡算法有很多,比如轮询、随机、加权轮询
如何才能实现一个会话粘滞(session sticky)的负载均衡算法呢?
我们可以通过哈希算法,对客户端IP地址或者会话ID计算哈希值,
将取得的哈希值与服务器列表的大小进行取模运算,
最终得到的值就是应该被路由到的服务器编号
数据分片
通过哈希算法对数据取哈希值,然后再跟n取模,最终得到的值,
就是应该被分配到的机器编号
通过哈希算法对处理的海量数据进行分片,多机分布式处理,可以突破单机资源的限制
分布式存储:
通过哈希算法对数据取哈希值,然后对机器个数取模,
这个最终值就是应该存储的缓存机器编号
一致性哈希算法
假设我们有k个机器,数据的哈希值的范围是[0, MAX]。
我们将整个范围划分成m个小区间(m远大于k),每个机器负责m/k个小区间。
当有新机器加入的时候,我们就将某几个小区间的数据,
从原来的机器中搬移到新的机器中。这样,既不用全部重新哈希、搬移数据,
也保持了各个机器上数据数量的均衡
利用一致性哈希算法,解决缓存等分布式系统的扩容、缩容导致数据大量搬移的难题