一、引言
Hash在开发中的应用非常广泛,包括文件完整性校验,数字签名,鉴权等方面,都有一定程度的应用,而Hash分支衍生的数据结构也是很重要的一部分,这篇文章就记录一下Hash的学习过程。
二、Hash【散列函数】
定义:把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。
- 哈希算法:将任意长度的二进制值串映射为固定长度的二进制值串。
- 哈希值:通过原始数据映射之后得到的二进制值串。
PS:Hash算法也被称为散列算法,Hash算法虽然被称为算法,但实际上它更像是一种思想。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为是Hash算法。
常见应用:文件完整性校验,数字签名,鉴权等方面
结构分析:
PS:之所以使用"头插法",把后面Hash碰撞的元素放在头节点,是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。
插入数据步骤
- 1、通过函数Hash("有梦想的肥宅")得到2,即在索引位2的地方插入name=“有梦想的肥宅”对应的数据
- 2、通过函数Hash("阿靓")得到4,即在索引位4的地方插入name=“阿靓”对应的数据
- 3、通过函数Hash("阿肥")得到2,即在索引位2的地方插入name=“阿肥”对应的数据,但是此时索引位置上面已经有数据了,这种情况称之为”Hash碰撞“,并使用“头插法”来插入链表
查询数据步骤
比如使用”有梦想的肥宅“关键字来查询数据:
- 1、通过函数Hash("有梦想的肥宅")得到2,即去索引位置为2的地方去找数据
- 2、拿到数组索引位置2的元素【链表】,比较链表内部第一个元素的name字段,发现不是我们需要找的数据,继续向后比较
- 3、取出链表内部第二个元素的name字段,比较后发现是我们需要查询的数据,此时查询结束,返回数据内容
三、Hash使用场景和优劣性分析
使用场景
我们在数据加密传输时经常会用到一些hash算法,且hash在文件完整性校验,数字签名,鉴权等方面都占有很重要的地位。如果作为数据查询索引的话,优势劣势都很明显,不过像是MySQL这种主流的数据库并没有采用Hash作为索引生成的工具,我们看看下面的优劣性分析就知道了。
常见应用
- MD5信息摘要算法
- SHA-1安全散列算法
- 文件完整性校验,数字签名,鉴权等
优势
- 很难找到逆向规律
- 提高存储空间的利用率
- 提高数据的查询效率【如用作索引或数据定位时,对关键字key进行一次hash计算就可以定位出数据存储的位置,效率相当高】
劣势
- 仅能满足 “=”,“IN”,不支持范围查询
- hash冲突过多时,也会对数据定位效率造成影响
参考资料:
Hash【散列函数】
原文:https://www.cnblogs.com/riches/p/14742765.html