undefined

一、哈希算法

哈希算法定义:将任意长度的二进制串映射为固定长度的二进制串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制串就是哈希值。需要满足几点要求:

  1. 从哈希值不能反向推导出原始数据
  2. 对输入数据非常敏感,哪怕原始数据只修改了一个 bit,最后得到的哈希值也大不相同
  3. 哈希冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小
  4. 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算出哈希值

1. 应用

  1. 安全加密

MD5(Message-Digest Algorithm,MD5消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)

DES(Data Encryption Standard,数据加密标准)、AES(Advanced Encryption Standard,高级加密标准)

  1. 唯一标识

如果要比较图片是否在图库中存在;图片的大小为 几十KB、几MB,如果转换成二进制是一个非常长的串,比对起来非常耗时。

可以给图片取一个唯一标识,从图片的二进制码串开头取100字节,中间取100字节,最后取100字节,然后将这 300 字节放在一块,通过哈希算法得到哈希字符串,将此作为图片的唯一标识。

  1. 数据校验

要下载一个 2GB 的电影,则需要分成 100 个文件去下载,为了防止这些文件被篡改,则会对比原文件和下载的文件的哈希值,如果不同就说明被篡改了。

  1. 哈希函数

2. 字典攻击和解决

有些人习惯用 0000、1234 这样的简单的数字组成做密码。

字典攻击:维护一个常用密码的字典表,把字典中的每个密码用哈希算法计算哈希值,然后和脱库后的密文对比。

解决:引入一个盐(salt),和用户的密码组合在一起,增加密码的复杂度,进一步增加破解的难度

3. 重要应用

  1. 负载均衡

如果我们需要在同一个客户端上,再一次会话中的所有请求都路由到同一个服务器上。

可以通过哈希算法,对客户端 IP 地址或者会话 ID 计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样就可以把同一个IP过来的所有请求,都路由到同一个后端服务器上。

  1. 数据分片

    • 有一个 1T 的日志文件,记录了用户的搜索关键字,想要快速统计出每个关键词被搜索的次数?

      两个难点,日志很大,无法放在一个机器的内存中;只用一台机器处理太慢

      我们可以先对数据进行分片,然后采用多台机器处理,每台机器读出的关键词,通过哈希函数计算哈希值,然后和 N 取模,最终得到的值就是应该被分配到的机器编号。这样哈希值相同的关键词就会分配到同一个机器上。每个机器分别计算关键词出现的次数,最后合并起来就是最终的结果。也是 MapReduce 的基本设计思想

  2. 分布式存储

    一致性哈希

    假设我们有 k 个机器,数据的哈希值的范围是[0, MAX]。我们将整个范围划分成 m 个小区间(m 远大于 k),每个机器负责 m/k 个小区间。当有新机器加入的时候,我们就将某几个小区间的数据,从原来的机器中搬移到新的机器中。这样,既不用全部重新哈希、搬移数据,也保持了各个机器上数据数量的均衡。除此之外,它还会借助一个虚拟的环和虚拟结点,更加优美地实现出来。

    https://www.zsythink.net/archives/1182