定义
将任意长度的二进制串映射为固定长度的二进制值串,这个映射的规则就是哈希算法。
实现
哈希算法现有的实现有很多,包括但不仅限于下面几种
- MD5
- SHA-1
- SHA-256
- ... 它们的实现需要满足下面几点要求
- 单向性:不能从哈希值推导出原始数据
- 敏感性:输入数据哪怕修改一个bit,得到的哈希值也大不相同
- 哈希冲突概率小:对于不同的输入数据,哈希值相同的概率要尽可能小
- 高效性:不管输入数据多长,都可以快速的计算出哈希值
应用
数据加密
利用的特性:单向性、敏感性、哈希冲突概率低
比如对用户密码进行加密后存储到数据库,用户登录比对密码哈希值。
唯一标识
利用的特性:敏感性、哈希冲突概率低
比如在一个海量图图库系统中,可以计算图片的哈希值作为数据库主键。
当在图库中检索一张图片时,通过哈希值找到图片记录,如果记录不存在,那么图片就是不存在;如果存在,可以获取到文件的存储路径,进行全量的二进制比较,确认是否为同一张图片。
数据校验
利用的特性:敏感性
一般提供文件下载的网站,出了提供文件包,还会提供使用哈希算法计算出的文件摘要和使用的哈希算法。
客户端下载文件后,为了防止文件被篡改,客户端可以本地通过相同的哈希算法计算出文件摘要,与下载的摘要文件进行比较,如果相等,那么文件没有被修改,否则文件被篡改。
比如Maven的仓库管理系统。
哈希表的哈希函数
利用的特性:哈希冲突概率低、高效性
比如编程语言提供的哈希表,查找元素时都会使用到哈希函数。
负载均衡
利用的特性:相同的输入源哈希的结果是一样的
网关计算请求ip的哈希值,取余后端服务集群数量,总是可以将相同的ip路由到同一个后端服务。
数据分片
利用的特性:哈希冲突概率小
比如,分布式计算MapReduce框架中,通过哈希将数据均匀地路由到各个服务器处理。
分布式存储
例如在分布式缓存系统中,借助数据分片的思路可以将数据均匀路由到服务器集群节点存储,但是存在一个问题,当减少/新增服务器节点,所有的数据必须重新计算哈希值,搬迁到正确的服务器,这时候如果如果有大量的请求,容易出现缓存雪崩现象,压垮数据库。
一致性哈希就是用来缓解这个问题的,每个服务器节点负责一个区间,不再是一个点,这样当发生减少/新增一个服务器节点的情况时,只需要在相邻区间的服务器节点搬迁数据即可。