数据加密 哈希算法

对称/非对称加密 信息摘要

图文彻底搞懂非对称加密(公钥密钥)

哈希算法

哈希思想:哈希表与哈希桶的深度解析
哈希表+哈希桶简介及实现

基本介绍

参考:hash算法详解
定义:散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。
哈希算法(Hash Algorithm)是一种将任意长度的消息映射为固定长度的消息摘要(Message Digest)的算法。哈希算法可以将任意长度的输入数据转换为固定长度的输出,通常称为哈希值(Hash Value)或摘要(Digest)。

算法特点

  1. 确定性:对于相同的输入数据,哈希算法会生成相同的哈希值。
  2. 不可逆性:无法从哈希值中推导出原始的输入数据。
  3. 唯一性:不同的输入数据生成的哈希值应尽可能不同。
  4. 散列性:即使输入数据仅有微小的变化,生成的哈希值应该有很大的差异。

应用领域

哈希算法广泛应用于密码学、数据完整性校验、数字签名、数据分片等领域。

  1. 数字签名:将原始数据的哈希值与签名一起存储,以验证签名的完整性和正确性。
  2. 密码存储:将用户密码的哈希值存储在数据库中,以避免直接存储明文密码,提高安全性。
  3. 数据完整性校验:将原始数据的哈希值与传输过程中的哈希值进行比对,以判断数据是否被篡改。
  4. 数据分片:将原始数据分成若干个块,对每个块分别计算哈希值,以便快速检测数据块的正确性。

常见哈希算法

参考:常见的hash算法及其原理

MD4

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

MD5

MD5是一种哈希算法,其输出长度为128位(32个16进制的字符)。MD5已被广泛应用于密码学安全领域,例如数字签名、数据加密等。但是,由于其输出长度较短且存在一些安全漏洞,现在已经不再被推荐使用。
算法详解:一文详解 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算法原理详解

SHA-512:
SHA512是SHA算法族中最安全的一种,其输出长度为512位(128个16进制字符)。SHA512比SHA256更安全,但计算速度更慢。它常用于对于高需求安全性的应用程序,例如密码学、数字签名等。

哈希算法的分类

按照功能,可以简单将哈希算法分为两类:应用于加密的哈希算法和应用于查找的哈希算法。
用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。
按照计算位置的方法,常见的哈希算法有如下几类:

  1. 加法Hash;
  2. 位运算Hash;
  3. 乘法Hash;
  4. 除法Hash;
  5. 查表Hash;
  6. 混合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函数代码示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值