哈希( Hash )算法的应用场景
0. 区块链的基本概念
区块链是一块块区块组成的,每个区块分为两部分:区块头和区块体。 区块头保存着 自己区块体 和 上一个区块头 的哈希值。 因为这种链式关系和哈希值的唯一性,只要区块链上任意一个区块被修改过,后面所有的区块保存的哈希值就不对了。 区块链使用的是 SHA256 哈希算法,计算哈希值非常耗时,如果要篡改一个区块,就必须重新计算该区块后面所有的区块的哈希值,段时间内几乎不可能做到。
1. 唯一标识
- 判断文件、字符串、图片等是否唯一
2. 校验数据的完整性和正确性
-
BT 下载中,多个数据块的完整性和正确性校验。
-
压缩文件的校验等
3. 安全加密
-
MD5
-
SHA
-
DES
-
AES
4. 散列函数
- 散列表
看中的是散列的平均性和哈希算法的执行效率。
5. 负载均衡
如何实现一个会话粘滞(session sticky)的负载均衡算法?
借助哈希算法,对客户端 IP 和 sessionID 计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。
6. 数据分片
如何统计“搜索关键词”出现的次数?
难点一:内存问题。难点二:处理效率很低。
我们可以先对数据进行分片,然后采用多台机器处理的方法,来提高处理速度。
具体思路:有 n 台机器,取关键字的 hash 值,hash 值对 n 取模,得到的值就是应该分配到那台机器。
如何快速判断图片是否再图库中?
插入:分布式环境下,先对图片进行依次哈希运算,得到的 hash 值进行对机器数取模,得到的值就是需要在那台机器插入到该机器的 hash 表。
查询:计算机器,到该机器的 hash 表中进行查询。
7. 分布式存储
用普通的 hash 值取模来计算机器,当有新的机器添加时,就需要重新计算所有的数据的 hash 值,如果在分布式缓存中,所有缓存全部失效,产生雪崩效应,所有请求打到数据库,数据库会被压垮。
[[一致性哈希算法( consistent hashing )]]
把整个 hash 值的范围划分成 m 个小的区间,然后在操作机器的时候,只会产生部分数据的搬迁 和 rehash,也保持了各个机器上数据数量的均衡。
其他问题
为何会产生 hash 碰撞?可以利用组合数学中的一个基础的理论,鸽巢原理(抽屉原理)。