Hash算法与Hash碰撞

 

什么是Hash算法。

散列函数(英语:Hash function)又称散列算法哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。[1]好的散列函数在输入域中很少出现散列冲突。在散列表数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。

                                                                                                                                                                             ---------- 来自维基百科

常见的Hash算法如:MD5、SHA

 

Hash函数的特点。

  • 确定性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。
  • 散列碰撞(collision):散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同。
  • 不可逆性:你无法通过hash值反算出原始数据。
  • 混淆特性:输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。

 

Hash冲突

Hash冲突就是两个不同的数据经过Hash函数计算得到的Hash值一样。

为什么呢?这涉及到数学中比较好理解的一个原理:抽屉原理。

抽屉原理:桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。

 

如何解决Hash冲突

开放寻址法:开放寻址法是一种解决碰撞的方法,对于开放寻址冲突解决方法,比较经典的有线性探测方法(Linear Probing)、二次探测(Quadratic probing)和 双重散列(Double hashing)等方法。

链表法:链表法是一种更加常用的散列冲突解决办法,相比开放寻址法,它要简单很多。在散列表中,每个位置对应一条链表,所有散列值相同的元素都放到相同位置对应的链表中。HashMap解决Hash冲突用的就是链表法。

 

以上来“自程序员吴师兄“  https://www.zhihu.com/question/20820286

 

posted @ 2020-02-22 21:37  得记点什么了  阅读(1999)  评论(0编辑  收藏  举报