hash算法_哈希排序算法

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

854cb3d52a63e9de2ec21d5446e2d7fe.png

哈希算法性质

如果两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的。如果两个散列值是相同的,两个输入值很可能是相同的,但不绝对肯定二者一定相等。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。

288c7f9b0130e2108c076e474a77dd77.png

哈希查找步骤

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

2、处理哈希碰撞冲突。如常用的拉链法和线性探测法。

c9830df64be805258ede2bb5ce8e3202.png

哈希常用算法

1、MD4

MD4(RFC 1320)是 MIT 的 Ronald L.Rivest在 1990 年设计基于 32 位操作数的位操作来实现的算法。

2、MD5

MD5(RFC 1321)是Rivest于1991年对MD4的改进版本号。

3、SHA-1及其它

SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举性能更好。

ec646e2b97bcd4d118e238f22b579d06.png

哈希时间复杂度

哈希算法就是把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。所以哈希表的插入和查找的时间复杂度都是O(1)。

5907db1c15d8f72c48c9877bdf7d2c48.png

哈希算法特点

在用到哈希进行管理的数据结构中,就对速度比较重视,对抗碰撞不太看中,只要保证哈希均匀分布就可以。在不同的使用场景中,如数据结构和安全领域里,其中对某一些特点会有所侧重。

7b7f08dcfa5dd2c0bc2d6a9eeb7dfaec.png

1、正向快速:给定明文和 Hash算法,在有限时间和有限资源内能计算出Hash值。

2、逆向困难:给定Hash值,在有限时间内很难逆推出明文。

3、输入敏感:原始输入信息修改一点信息,产生的Hash值都有很大的不同。

8f6507c5251c20f008f583c79e5d49f0.png

4、冲突避免:很难找到两段内容不同的明文,使得它们的Hash值一致。即对于任意两个不同的数据模块,其Hash值相同的可能性极小。对于给定的数据块,找到和它Hash值相同的数据块极为困难。

5df2e38a9175a2a899737dc1fb6e812f.png

哈希构造方法

1、直接定址法:地址集合和关键字集合大小相同

2、数字分析法:根据Hash的关键字的特点选择合适Hash算法。

3、平方取中法:取关键字平方之后的中间极作为哈希地址,一个数平方之后中间几位数字与数的每一位都相关,取得位数由表长决定。

4、折叠法:关键字位数很多,关键字每一位上的数字分布大致均匀的时候,可以采用折叠法得到哈希地址。

5、随机数法:通常关键字不等的时候采用此法构造哈希函数较恰当。

502835bb16ca31bb82623ff9037fff5e.png

哈希算法的应用

1、文件校验

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

55ad19b0fdf06bea74f871b419d49312.png

2、数字签名

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

304042579fefd6d0adc34984ba26118f.png

3、鉴权协议

传输信道是可被侦听的,但在不可被篡改的情况下,这是一种简单而安全的传输方法。

5109ebaa1a040761c5d854d6746115b9.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值