当前位置:首页 > 哈希资讯 > 正文内容

「数据结构与算法」哈希算法的原理和应用详解

4个月前 (05-27)哈希资讯698

在程序员的实际开发中,哈希算法常常能用得到,本文以哈希算法的原理和应用为核心,和大家详细讲解一下哈希算法的概念、常见算法以及原理、在信息安全的应用等等。

「数据结构与算法」哈希算法的原理和应用详解

一、概念

哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。

使用哈希查找有两个步骤:

1. 使用哈希函数将被查找的键转换为数组的索引。在理想的情况下,不同的键会被转换为不同的索引值,但是在有些情况下我们需要处理多个键被哈希到同一个索引值的情况。所以哈希查找的第二个步骤就是处理冲突。

2. 处理哈希碰撞冲突。有很多处理哈希碰撞冲突的方法,本文后面会介绍拉链法和线性探测法。哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样只需要很少的内存。哈希表使用了适度的时间和空间来在这两个极端之间找到了平衡。只需要调整哈希函数算法即可在时间和空间上做出取舍。

「数据结构与算法」哈希算法的原理和应用详解

在Hash表中,记录在表中的位置和其关键字之间存在着一种确定的关系。这样我们就能预先知道所查关键字在表中的位置,从而直接通过下标找到记录。使ASL趋近于0.

1)哈希(Hash)函数是一个映象,即将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可;

2)由于哈希函数是一个压缩映象,因此,在一般情况下,很容易产生“冲突”现象,即: key1!=key2,而 f (key1) = f(key2)。

3)只能尽量减少冲突而不能完全避免冲突,这是因为通常关键字集合比较大,其元素包括所有可能的关键字, 而地址集合的元素仅为哈希表中的地址。在构造这种特殊的“查找表” 时,除了需要选择一个“好”(尽可能少产生冲突)的哈希函数之外;还需要找到一 种“处理冲突” 的方法。

「数据结构与算法」哈希算法的原理和应用详解

二、常用哈希算法的介绍:

1.MD4

MD4(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest(消息摘要) 的缩写。它适用在32位字长的处理器上用高速软件实现——它是基于 32位操作数的位操作来实现的。

2.MD5

MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

3.SHA-1及其他

SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计师基于和MD4相同原理,并且模仿了该算法。

「数据结构与算法」哈希算法的原理和应用详解三、常见哈希算法的原理

散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间。70/100=0.7,这个数字称为负载因子。我们之所以这样做,也是为了“快速存取”的目的。我们基于一种结果尽可能随机平均分布的固定函数H为每个元素安排存储位置,这样就可以避免遍历性质的线性搜索,以达到快速存取。但是由于此随机性,也必然导致一个问题就是冲突。所谓冲突,即两个元素通过散列函数H得到的地址相同,那么这两个元素称为“同义词”。这类似于70个人去一个有100个椅子的饭店吃饭。散列函数的计算结果是一个存储单位地址,每个存储单位称为“桶”。设一个散列表有m个桶,则散列函数的值域应为[0,m-1]。

「数据结构与算法」哈希算法的原理和应用详解

四、Hash算法在信息安全方面的应用

1.文件校验

我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

MD5 Hash算法的“数字指纹”特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。

「数据结构与算法」哈希算法的原理和应用详解

2.数字签名

Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称“数字摘要”进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。

3.鉴权协议

鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。

以上就是哈希算法的原理和应用详解,不知道大家都明白了吗?

另外,对现在我们的大多数朋友来说还是学编程技术最重要!栽一棵树最好的时间是十年前,其次是现在。对于准备学习编程的小伙伴,如果你想更好地提升你的编程核心能力(内功)不妨从现在开始!

扫描二维码推送至手机访问。

版权声明:本文由数字哈希发布,如需转载请注明出处。

本文链接:http://www.86estate.com/post/3.html

分享给朋友:

“「数据结构与算法」哈希算法的原理和应用详解” 的相关文章

一文读懂哈希和一致性哈希算法

一文读懂哈希和一致性哈希算法

哈希 Hash 算法介绍哈希算法也叫散列算法, 不过英文单词都是 Hash, 简单一句话概括, 就是可以把任意长度的输入信息通过算法变换成固定长度的输出信息, 输出信息也就是哈希值, 通常哈希值的格式是16进制或者是10进制, 比如下面的使用 md5 哈希算法的示例md5("12345...

关于哈希的一切,都在这里了

关于哈希的一切,都在这里了

上一节,我们一起学习了,在Java中如何构建高性能队列,里面牵涉到很多底层的知识,不知道你有Get到多少呢?!本节,我想跟着大家一起重新学习下关于哈希的一切——哈希、哈希函数、哈希表。这三者有什么样的爱恨情仇?为什么Object类中需要有一个hashCode()方法?它跟equals()方法有什么关...

哈希值,万物的编号,区块链的基础

哈希值,万物的编号,区块链的基础

在区块链浏览器中,可以看到,每一个区块,都有区块哈希值。哈希值是什么意思?以人为例,要分辨两个人是否是同一个人,不能靠姓名,因为姓名的重复率太高。最好的办法,是给每个人一个唯一的编号,比如身份证号。身份证号由区位编码+出身年月日+次序+验证码组成,嵌入了地域类别和时间类别,解决了人的重复问题。可人的...

哈希值的定义与应用

哈希值的定义与应用

什么是哈希值哈希值就是文件的身份证,不过比身份证还严格。他是根据文件大小,时间,类型,创作者,机器等计算出来的,很容易就会发生变化,谁也不能预料下一个号码是多少,也没有更改他的软件。哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的...

哈希娱乐MASS打造区块链杀手级应用

哈希娱乐MASS打造区块链杀手级应用

目前市场大盘牛熊不明,全球币圈都在做调整的时候,只有区块链游戏和Gaming在逆流而上。据可查数据显示,早在2017年行业还在讨论如何将Dapp落地的时候,游戏行业就诞生了现象级的产品。现如今行内的主要用户也都集中在区块链游戏领域,可想而知,Block-chain+Game有多么的受欢迎。为什么在区...

哈希世界区块链游戏开发 区块链游戏沙盒开发 区块链游戏开发工作

哈希世界区块链游戏开发 区块链游戏沙盒开发 区块链游戏开发工作

作为区块链游戏开发人员,我们密切关注整个行业发展动态。哈希世界的创建者贾英昊是清华大学工业工程系的博士,他的职位是北美区块链协会的一名资深研究员。具有深入的研究及区块链项目和技术的丰富经验,并在行业核心媒体上发表了多篇专栏文章;团队拥有区块链技术实现和项目落地经验,中心成员毕业于清华大学、北京大学等...