哈希算法

哈希算法

  • 将任意长度的二进制值映射为固定长度的二进制值串,这个映射的规则就是“哈希算法”,而通过原始数据映射之后得到的二进制值串就是“哈希值”。

哈希算法需要满足的几点要求

  • 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
  • 对输入数据敏感,输入数据有一点变动,最后得到的哈希值也不相同;
  • 散列冲突的概率很小,对于不同的原始数据,哈希值相同的概率非常小;
  • 哈希算法的执行效率要尽量高效,针对较长文本,也能快速地计算出哈希值。

哈希算法的应用

一、安全加密

  • 常用于加密的哈希算法MD5(消息摘要算法)、SHA(安全散列算法)、DES(数据加密标准)、AES(高级加密标准);对于加密的哈希算法,有2点格外重要,第一,根据哈希值要很难反推出原始数据;第二,散列冲突的概率要很小。
  • 第二点是无法完全做到的,但是产生冲突的概率也很小。

二、唯一标识

  • 哈希算法可以对大数据做信息摘要,通过一个较短的二进制编码来表示很大的数据。比如鉴别图片的唯一性,可以取图片二进制码串头部100个字节,中间100个字节,最后100个字节,放到一块儿,通过哈希算法得到一个哈希字符串,作为图片的唯一标识。
  • 如果想继续提高效率,可将每个图片的唯一标识和图片文件在图片库的路径信息都存在散列表中。当要查看某个图片是否存在于图库中,先通过哈希算法对图片取唯一标识,然后在散列表中查找是否存在这个唯一标识。如果不存在,说明图库中无此图;如果存在,再通过保存的图片文件路径,获取这个已经存在的图片,与现在想要插入的图片做全量对比,看是否完全一样。如果一样,说明已经存在;如果不一样,说明两张图片尽管唯一标识相同,但并不是相同的图片(出现了散列冲突)。

三、数据校验

  • 先说下BT下载的原理,BT下载是基于P2P协议的,可以从多个机器上并行下载一个大文件,该文件可能被分成很多文件块。等所有的文件块都下载完成之后,再组装成一个完整的文件就行了。
  • 那么如何校验文件块的安全性、正确性、完整性。一种思路,可以对每个文件块分别取哈希值,保存在种子文件中。当文件下载完成后,通过相同的哈希算法,对下载好的文件再逐一取哈希值,和种子文件中保存的哈希值进行对比。

四、散列函数

  • 散列函数对于散列算法冲突的要求低很多(即便出现冲突,只要不是过于严重,都可以通过开放寻址法或链表法解决),对于是否能反向解密也并不关心。它更加关注的是散列后的值是否能平均分布,并且散列函数用的散列算法一般都比较简单,比较追求效率。

五、负载均衡

  • 实现一个会话粘滞(session sticky)的负载均衡算法。
  • 考虑维护一张IP或会话ID与服务器编号的映射关系的关系表,它的缺点如下:
    1.如果客户端很多,那么映射表可能很大,浪费内存空间;
    2.客户端上、下线,服务器扩容、缩容都会导致映射关系失效,这样维护映射表的成本就会很大。
  • 借助哈希算法实现,对客户端IP或会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号,这样可以实现会话粘滞的负载均衡算法。

六、数据分片

  • 快速统计“搜索关键词”出现的次数,2个难点,第一搜索日志很大,没法放到一台机器的内存中;第二如果用一台机器处理巨大的数据,处理时间会很长。
  • 可以先对数据分片,然后采用多台机器处理的方法,提升处理速度。通过搜索到的关键词的hash值,跟处理机器的数量n取模,最终得到应该被分配到的机器编号,这样,同一个搜索关键词被分配到同一个机器上。每个机器分别计算关键词出现的次数,最后合并起来就是最终的结果。

七、分布式存储

  • 分布式缓存,如果简单的使用数据分片的思想,取数据哈希值再根据机器数量取模,如果数据增多,就需要扩容,所有的数据都要重新计算哈希值,然后将数据重新搬移到正确的机器上,这样相当于缓存数据一下全都失效,所有的数据请求都会造成缓存穿透,直接请求数据库,这样可能发生雪崩效应,压垮数据库。
  • 可以使用一致性哈希算法,假设有k个机器,数据的哈希值范围是[0, MAX]。我们将整个范围划分成m个小区间(m远大于k),也就是每个机器负责m/k个小区间。当有新机器加入的时候,我们就将某几个小区间的数据,从原来的机器中搬移到新的机器中。这样,既不用重新哈希、搬移数据,也保持了各个机器上数据量的均衡。

你可能感兴趣的:(哈希算法)