哈希算法

将任意长度的二进制值串映射为固定长度的二进制值串,这个映射规则就是哈希算法,映射后的值叫做哈希值。

哈希算法的要求

  • 从哈希值不能反向推导出原数据
  • 对输入数据敏感,原始数据有一位不一样得到的哈希值也大不相同
  • 散列冲突的概率要小
  • 执行效率要高,执行效率应该与原值长度无关

哈希算法的应用

安全加密

  • MD5:消息摘要算法
  • SHA:安全散列算法
  • DES:数据加密标准
  • AES:高级加密标准

哈希算法是基于一个数学理论鸽巢原理。如果 MD5 哈希值是固定的 128 位,则总共可以产生 2^128 个哈希值,如果要对 2^128 + 1 个数据求哈希值,则必然会存在冲突。

鸽巢原理(也叫抽屉原理)。如果有 10 个鸽巢,有 11 只鸽子,那肯定有 1 个鸽巢中的鸽子数量多于 1 个,即肯定有 2 只鸽子在 1 个鸽巢内。

唯一标识

图片存储比对可以利用图片信息生成哈希值来比对,减少比对难度。

数据校验

常见的有应用程序安装包校验;
BT文件块的下载校验

散列函数

负载均衡

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

数据分片

利用哈希算法将数据分片存储到不同的机器上,减少单机压力。

分布式存储

利用数据分片将不同的数据存储在不同的机器上,但是如果数据量过大需要扩容 N 个机器,此时原来的数据取模的基数变了,需要迁移数据。例如使用 Redis 缓存时,这种情况可能就会直接发生雪崩效应,Redis 暂时无法提供服务,请求全部压在数据库上。

可以利用一致性哈希算法来解决这个问题,抽象出一个 m 区间的哈希环,然后利用已有的机器节点将这个环分割,机器负载落在某个分割环的一个区间,不再是直接对应到机器上。这样当某个机器故障后,只需要将这一部分数据迁移到他的临近机器上,不需要全部数据迁移。参见:一致性哈希