哈希算法
将任意长度的二进制值串映射为固定长度的二进制值串,这个映射规则就是哈希算法,映射后的值叫做哈希值。
哈希算法的要求
- 从哈希值不能反向推导出原数据
- 对输入数据敏感,原始数据有一位不一样得到的哈希值也大不相同
- 散列冲突的概率要小
- 执行效率要高,执行效率应该与原值长度无关
哈希算法的应用
安全加密
- 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 区间的哈希环,然后利用已有的机器节点将这个环分割,机器负载落在某个分割环的一个区间,不再是直接对应到机器上。这样当某个机器故障后,只需要将这一部分数据迁移到他的临近机器上,不需要全部数据迁移。参见:一致性哈希