哈希算法
简介
将任意长度的二进制值串映射为固定长度的二进制值串的映射规则就是哈希算法
得到的二进制值串就是哈希值
优秀的哈希算法包括
- 从哈希值不能反推出原始数据
- 对输入数据非常敏感, 哪怕一点小修改, 结果也大不相同
- 散列冲突的概率要很小, 对不同原始数据, 哈希值相同的概率非常小
- 执行效率要高效, 针对较长的文本, 也能快速计算出哈希值
鸽巢原理
为什么哈希算法无法做到零冲突
因为哈希值的长度是固定的, 那么就表示数据是有限的, 而要哈希的数据是无限的, 就必然会有数据存在哈希值相同的情况
哈希算法的应用
- 安全加密
MD5, SHA, DES, AES等
虽然加密后不容易反推出原始数据, 但是存在字典攻击, 黑客通过庞大的原文对密文的字典表, 很容易猜中用户的常用密码
针对字典攻击, 又可以使用加盐的方式来防御, 比如对原始密码加入再加入复杂的字符串后哈希, 来增加破解难度
安全和攻击是一种博弈关系, 不存在绝对的安全, 所有安全措施只是增加攻击成本而已 - 唯一标识
针对较大的文件或者图片, 取部分字节通过哈希算法生成唯一标识, 再存储到散列表中, 可以快速判断图片是否存在 - 数据校验
使用BT下载时, 基于p2p协议会从多个电脑上并行下载, 一部电影会分为多个文件块
可以使用种子文件中保存的每个文件块的哈希值来判断, 每个文件块是否被人修改或者缺失 - 散列函数
散列表的散列函数也是哈希算法的一种应用
不过相对其他, 散列函数对冲突要求低很多, 且对于能否反向解密也不关心, 而更加关心散列后的值是否分布均匀 - 负载均衡
负载均衡的算法有轮询, 随机, 加权轮询等, 如果要实现同一个客户端, 在一次会话中的所有请求都路由到同一个服务器的话, 可以借助哈希算法
通过哈希算法, 对客户端ip地址或者会话id计算哈希值, 将取得的哈希值与服务器列表的大小取模运算, 最终得到的值就是应该被路由到的服务器编号 - 数据分片
分布式计算中, 对数据根据key哈希, 再根据机器数取模, key相同的数据就可以分配到同一台机器上处理 - 分布式存储
分布式存储中常用的一致性哈希算法