zoukankan      html  css  js  c++  java
  • 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冲突过多时,也会对数据定位效率造成影响

    参考资料:

  • 相关阅读:
    openstack搭建11、 Horizon集群
    openstack搭建10、 Neutron控制/网络节点集群
    openstack搭建9、 Nova控制节点集群
    openstack搭建8、部署glance镜像服务
    openstack搭建7、部署Keystone
    openstack部署6、部署Haproxy
    openstack部署5、部署PCS
    优化RabbitMQQ性能
    openstack搭建4、部署rabbitmq消息队列
    Metasploit 端口扫描 漏洞利用
  • 原文地址:https://www.cnblogs.com/riches/p/14742765.html
Copyright © 2011-2022 走看看