大家好,欢迎来到IT知识分享网。
目录
对称/非对称加密 信息摘要
哈希算法
基本介绍
参考:hash算法详解
定义:散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。
哈希算法(Hash Algorithm)是一种将任意长度的消息映射为固定长度的消息摘要(Message Digest)的算法。哈希算法可以将任意长度的输入数据转换为固定长度的输出,通常称为哈希值(Hash Value)或摘要(Digest)。
算法特点
- 确定性:对于相同的输入数据,哈希算法会生成相同的哈希值。
- 不可逆性:无法从哈希值中推导出原始的输入数据。
- 唯一性:不同的输入数据生成的哈希值应尽可能不同。
- 散列性:即使输入数据仅有微小的变化,生成的哈希值应该有很大的差异。
应用领域
哈希算法广泛应用于密码学、数据完整性校验、数字签名、数据分片等领域。
- 数字签名:将原始数据的哈希值与签名一起存储,以验证签名的完整性和正确性。
- 密码存储:将用户密码的哈希值存储在数据库中,以避免直接存储明文密码,提高安全性。
- 数据完整性校验:将原始数据的哈希值与传输过程中的哈希值进行比对,以判断数据是否被篡改。
- 数据分片:将原始数据分成若干个块,对每个块分别计算哈希值,以便快速检测数据块的正确性。
常见哈希算法
参考:常见的hash算法及其原理
MD4
MD4(RFC 1320)是 MIT 的Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest(消息摘要) 的缩写。它适用在32位字长的处理器上用高速软件实现——它是基于 32位操作数的位操作来实现的。
MD5
SHA家族算法
SHA-1:
SHA全称是Secure Hash Algorithm。
SHA-1是一种哈希算法,其输出长度为160位(40个16进制字符)。SHA1比MD5更安全,但也存在一些安全漏洞。美国国家安全局已经将SHA1归为不安全的算法之一。
SHA-256:
SHA256是SHA算法族中最常用的一种,其输出长度为256位(64个16进制字符)。SHA256比SHA1更安全,因此在许多应用程序中使用。它常用于数字证书的签名和验证、网络安全协议等。
算法介绍和openssl接口调用实现:openssl+sha256开发实例(C++)
算法原理详解:SHA256算法原理详解
哈希算法的分类
按照功能,可以简单将哈希算法分为两类:应用于加密的哈希算法和应用于查找的哈希算法。
用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。
按照计算位置的方法,常见的哈希算法有如下几类:
- 加法Hash;
- 位运算Hash;
- 乘法Hash;
- 除法Hash;
- 查表Hash;
- 混合Hash;
文件的哈希:
文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。
实际中的Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。
散列表(哈希表)、散列函数(哈希函数)
哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
负载因子 散列冲突 冲突解决
负载因子:
比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间。70/100=0.7,这个数字称为负载因子。我们之所以这样做,也是为了“快速存取”的目的。我们基于一种结果尽可能随机平均分布的固定函数H为每个元素安排存储位置,这样就可以避免遍历性质的线性搜索,以达到快速存取。
散列冲突:
但是由于此随机性,也必然导致一个问题就是冲突。所谓冲突,即两个元素通过散列函数H得到的地址相同,那么这两个元素称为“同义词”。散列函数的计算结果是一个存储单位地址,每个存储单位称为“桶”。设一个散列表有m个桶,则散列函数的值域应为[0,m-1]。
冲突解决:
(1)线性探查法:冲突后,线性向前试探,找到最近的一个空位置。缺点是会出现堆积现象。存取时,可能不是同义词的词也位于探查序列,影响效率。
(2)双散列函数法:在位置d冲突后,再次使用另一个散列函数产生一个与散列表桶容量m互质的数c,依次试探(d+n*c)%m,使探查序列跳跃式分布。
常见散列函数
直接寻址法
数字分析法
平方取中法
折叠法
随机数法
除留余数法
ADLER32算法
算法原理基本介绍:
C语言实现Adler-32哈希算法(含源码)
Adler-32校验算法
代码实现:
C++ adler32函数代码示例
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/157158.html