本文所有内容都是由作者咀嚼完王争的《数据结构与算法之美》得出的。如果觉得对你有用,请点赞加关注。如果你觉得讲得好,请前往极客时间购买本课程。
另外,我们都站在巨人的肩膀上
开篇
不知道有多少人和我一样,在工作中一直听到关于哈希的各种名词,像哈希加密、哈希值、哈希表、哈希算法、哈希函数等等。
但是有都不知道是什么意思,并且经常搞混。听到别人说哈希XXXX的时候就只能
如果你和我一样,那就可以继续看下去了。如果你都懂了,那我们不一样,你走吧
是什么?
我相信在工作中在听到哈希的同时往往会伴随着另一个词——散列。哈希和散列分别是什么意思,他们之间又有什么关系呢?
我们先来看一下散列表
散列表
散列表是一种基于数组实现的数据结构,其结构如下图所示
key代表输入的值也就是数据本身
hash function代表哈希函数
table代表数组
key通过hash function转变为哈希值(数字)。将key作为值,哈希值作为下标存入数组。
这样一个散列表就实现了。当然这只是最简单的实现过程,是为了方便理解举的一个例子
通过上面散列的解释,相信已经能够理解哈希算法和散列表之间的关系了。即散列表是基于数组实现的一种数据结构,其中实现的关键是哈希函数。哈希函数所运用的算法称之为哈希算法,得到的结果称之为哈希值。
所以可以把散列表理解为是哈希函数的一种使用场景
哈希算法
讲完了散列表,接下来我们就开始哈希算法了
其实通过散列表,相信你对哈希函数一定已经有些感觉了,我来帮你把这种感觉总结一下
将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法
换言之只要任何一个算法它满足了上面这个特性,那么它就是一个哈希算法。
不过上面这句话是哈希算法的基本概念,哈希算法还应该具备以下几个特点:
- 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)
- 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同
- 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小
- 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值
你可以反复咀嚼下上面四个特点,试着需寻找有没有那些用过的方法是具备以上四个特性的,相信思维敏捷的你可能会联想到MD5方法
没错MD5实际上就是一种哈希算法
MD5("今天我来讲哈希算法") = bb4767201ad42c74e650c1b6c03d78fa
MD5("jiajia") = cd611a31ea969b908932d44d126d195b
使用场景
讲完了,理清了哈希算法本身以后,让我们来结合使用场景来讲讲哈希算法的用途
现列举一下哈希算法的几个使用场景
- 安全加密
- 唯一标识
- 数据校验
- 散列函数
- 负载均衡
- 数据分片
- 分布式存储
安全加密
安全加密应该是大家接触或者使用做多的场景,因为像常用的MD5、SHA、DES、AES等等方法都属于哈希算法
那为什么哈希算法能用于安全加密呢,主要是凭借着其第1和2个特点,符合了加密的需求
唯一标识
这一点其实也容易理解,试想一下如果要在服务器上实现文件存储,那如何做到防止客户端重复上传同一张图片导致服务器硬盘空间被浪费呢?
没错,可以使用哈希算法来实现。我来简单地讲一下实现的思路。
- 首先服务器拿到文件后,根据文件内容进行MD5得到一个哈希值
- 将哈希值作为文件名称,来存储文件
- 当有新文件上传时,重复第一步,使用哈希值去判断服务器上有无该文件,没有则存储,有则代表是重复文件
很明显这个思路是依赖于哈希算法的第2,3个特点实现的。只要是两个相同的文件,那么他们的哈希值也必然是相同的。
数据校验
这个使用场景和上一个非常的相似,常见于第三方平台的接口对接
比如微信接口,对接过微信接口的小伙伴都应该知道,微信接口要求传递一个sign参数,官方文档称为签名。目的是为了校验请求参数的合法性,参数有没有被篡改。
这也就是依赖第2个特点实现的,若哈希内容被修改过,其哈希值会发生巨大变化
散列函数
这一点我们在前面已经介绍过了,这里就不再详细解释了。散列表的哈希函数运用到了第3,4个特点
这里我们可以解释下为什么对于不同的原始数据,哈希值相同的概率非常小
哈希算法产生的哈希值的长度是固定且有限的。比如前面举的 MD5 的例子,哈希值是固定的 128 位二进制串,最多能表示 2^128 个数据。
且慢,这样看来哈希算法得出的哈希值应该就不会重复了吧
no no no下面要介绍一个数学概念了——鸽巢原理
它是说,如果有 10 个鸽巢,有 11 只鸽子,那肯定有 1 个鸽巢中的鸽子数量多于 1 个,换句话说就是,肯定有 2 只鸽子在 1 个鸽巢内。
基于鸽巢原理,如果我们对 2^128+1 个数据求哈希值,就必然会存在哈希值相同的情况。
---------------------------------未完待续-----------------------------------