哈希及其应用(字典,加密等)

一、名词说明

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

哈希:指压缩映射的转换过程。

哈希函数:实现散列算法的函数,即实现映射转换的函数。

哈希表:存放记录的数组,即存放散列值的数组。

 

二、哈希函数特点

本篇不介绍哈希函数的具体实现,只讲解其原理和应用。

哈希函数的主要特点:

1、哈希函数的输入(message)可以是任何数字化的东西,包括图像和音乐,输入(digest)是一系列固定的数值。

2、单向性:给定d,很难找到M使得H(M)= d。

3、映射分布均匀性:哈希的输出结果中, 0和1 的 bit 比特总数大致相等, 输入变化一个比特,输出有一半以上的结果会变化。

4、碰撞抵抗:给定M,很难找到M',满足H(M)=H(M');

 

三、哈希函数的应用

特点决定其功能应用。

1、压缩函数MD5,SHA-1等都是常用的哈希函数

2、公钥密码学的明文预处理(例如,OAEP)

3、消息认证

4、哈希树(用于数字签名和时间戳)

5、通用密钥加密

6、实现数据结构 - 字典

 

四、哈希的思想与设计 - 字典为例

字典结构的三个基本操作(添加元素,获取元素和删除元素)的平均时间复杂度为O(1)。

不同编程语言对字典的实现:python的dict、java的dictionary、c#的Dictionary、lua的table等。

具体设计方法:

1、选定一个整数的下标范围(如0-N)的顺序表

2、选定一个从实际关键码集合到上述下标范围的适当映射h:

    在需要存入关键码数据为key的数据时,将其存入表中第h(key)个位置;

    遇到以key为关键码的检索时,直接去找表中第h(key)个位置的元素。

哈希函数就是一个映射,只要使得任何关键字由此所得的哈希函数值都落在表长允许的范围之内即可。本质上看哈希函数不可能做成一个一对一的映射关系,其本质是一个多对一的映射,对于k1≠k2,存在h(k1) = h(k2),即哈希碰撞是不可避免的。

所以一般采用如下方法,将哈希表设计为二维结构。

哈希及其应用(字典,加密等)_第1张图片

如上图所示,左侧部分是一个一维顺序存储的数组,数组单元格里的内容是指向另一个链式数组的指针。图中绿色部分是,绿色部分右侧的白色部分是指向下一对键值对的指针。

hash表的工作原理:
(1).第一步 先根据给定的key和散列算法得到具体的散列值,也就是对应的数组下标。
(2).第二步,根据数组下标得到此下标里存储的指针,若指针为空,则不存在这样的键值对,否则根据此指针得到此链式数组。(此链式数组里存放的均为一对对)。
(3).遍历此链式数组,分别取出Key与给定的Key比较,若找到与给定key相等的Key,即在此hash表中存在此要查找的键值对,此后便可以对此键值对进行相关操作;若找不到,即为不存在此 键值对。

所以hash表其实就是管理一对对这样的结构,此链式数组用于处理哈希冲突的情况。

参考:

https://www.jianshu.com/p/4a0f0dfc443d

百度百科

 

你可能感兴趣的:(算法,哈希,字典的实现)