目录

哈希( 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 碰撞?可以利用组合数学中的一个基础的理论,鸽巢原理(抽屉原理)