Hash【散列函数】

一、引言 

  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冲突过多时,也会对数据定位效率造成影响

参考资料:

原文地址:https://www.cnblogs.com/riches/p/14742765.html