哈希算法的应用
哈希算法
将任意长度的二进制值串映射成固定长度的二进制值串,这个映射规则就是哈希算法。
通过原始数据映射之后得到的二进制值串就是哈希值。
一个优秀的哈希算法需满足以下几点:
- 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)
- 对输入数据非常敏感,即使原始数据只修改了一个Bit,最后得到的哈希值也大不相同
- 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小
- 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算出哈希值。
哈希算法应用
安全加密
最常用于加密的哈希算法是MD5 和 SHA。
唯一标识
举例说明:
在海量的图库中,搜索一张图是否存在,如果我们将要查找图片的二进制码串与图库中的所有图片的二进制码串一一对比,那将是一个非常耗时的操作。
我们可以给每个图片一个唯一标识。可以从图片的二进制码串开头取100个字节,最后取100个字节,将这200个字节通过哈希算法得到的哈希值作为该图片的唯一标识,搜索的时候如果唯一标识相同,则进行全量对比。
数据校验
BT下载的原理是基于P2P协议的。我们从多个机器上并行下载一个2GB的电影,这个电影可能会被分割成多个文件块,等所有的文件块都下载完成后,再组装成一个完整的电影文件。
基于网络传输的不安全性,为了保证文件块的安全和正确,我们可以对每个文件块进行哈希,将哈希值都保存在种子文件中。当文件下载完成后,我们对比每个文件块的哈希值,根据哈希函数的数据敏感性,如果哈希值不相同,则证明该文件块不安全,需要重新下载。
散列函数
负载均衡
如何实现一个会话粘滞的负载均衡算法,就是我们需要再同一个客户端上,在一次会话中的所有请求都路由到同一个服务器上。
我们可以通过哈希算法,对客户端IP得知或者会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。
数据分片
场景如下:
统计搜索关键词出现的次数: 我们可以先对数据进行分片,然后多台机器处理。我们从搜索日志中得出搜索关键词,通过哈希函数计算出哈希值,然后跟机器数量取模,将搜索关键词分配到取模后的机器编号上。
相同哈希值的搜索关键词被分配到了同一个机器上,每个机器分别计算出关键词出现的次数,最终合并起来就是最终的结果。
分布式存储
现在互联网面对的都是海量的数据、海量的用户。我们有海量的数据需要缓存,我们需要将数据分布到多台机器上。
我们可以根据前面数据分片的思想,通过哈希算法对数据取哈希值,然后对机器个数取模,这个最终值就是应该存储的缓存机器编号。
但是如果我们需要对机器扩容,这时候就比较麻烦了,所有的数据都要重新计算哈希值,然后重新搬移到正确的机器上,这样就相当于所有的缓存数据都失效,就会造成缓存雪崩,压垮数据库。
这时候我们就用到了一致性哈希算法。