ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

hash 碰撞的2种解决办法

2022-04-27 23:01:21  阅读:180  来源: 互联网

标签:解决办法 hash 数组 碰撞 探测 链表 步长 哈希


hash碰撞:hash长度是有限的,比如MD5 但是可以生成哈希的原文远比hash多的多,当两个不同原文算出一样的hashCode的时候,就发现了哈希碰撞

 

 

hash碰撞的解决办法总的来说有两种。

  1 开放链表法(Java的hashMap 的解决方案)

     哈希值取模数组长度,得到应该存放的数组下标的位置,如果重复,那就就放在这个数组下标的链表里面,查找的时候如果对应下标里面链表有多个值,依次和原文比对是否相等

  2 开放地址法探测法(据说python用的正种)

    同样是数组,同样是哈希取取模,如果下标已经有位置,那么久依次放到后面一个格子里面去,如果还是有,继续找下一个,知道找到空的位置放。

    查询的时候,算出hash值,对比原文相等就返回,不等就找下一个,如果下一个是空,就表示找不到,如果下一个不是空就继续下一个,直到找到为止。

 

    开发地址法有多个变种,他们都是堆下下一个的步长做了优化。

      线探测:步长是1,逐步增加。

      平方探测法:步长按照平方增加。

      二次哈希:步长是由另外一个hash函数取模数组长度决定。

    

 

 

 

优缺点:

    开放链表法:占用空间小,性能只有在链表里面有大量数据才开始慢慢线性衰减。

    开发地址探测法:数组空间不到一半的时候效率高,数组空间接近满的时候遍历速度急剧下降,甚至查找一个对象遍历整个数组。并且最多只能装数组长度个对象。

 

  很明显开发链表法个各便都有优势。据说python里面的hash结构用的开放地址探测法额缘由不得而知,不用Python,所以没有去验证具体用的什么算法。

 

 

 

  

标签:解决办法,hash,数组,碰撞,探测,链表,步长,哈希
来源: https://www.cnblogs.com/cxygg/p/16201020.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有