zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    图片原理解说(综合版:JPEG,PNG,BMP,GIF)
    PHP ImageMagick
    [android] 练习使用ListView(三)
    [android] 练习使用ListView(二)
    [android] 练习使用ListView(一)
    [android] 练习viewpagerindicator的使用(二)
    [android] 练习viewpagerindicator的使用(一)
    [android] 练习PopupWindow实现对话框
    [android] 练习样式主题自定义activity切换动画
    [android] 安卓自定义样式和主题
  • 原文地址:https://www.cnblogs.com/kbian/p/12347381.html
Copyright © 2011-2022 走看看