hash 碰撞的2种解决办法
2022/4/27 23:43:18
本文主要是介绍hash 碰撞的2种解决办法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
hash碰撞:hash长度是有限的,比如MD5 但是可以生成哈希的原文远比hash多的多,当两个不同原文算出一样的hashCode的时候,就发现了哈希碰撞
hash碰撞的解决办法总的来说有两种。
1 开放链表法(Java的hashMap 的解决方案)
哈希值取模数组长度,得到应该存放的数组下标的位置,如果重复,那就就放在这个数组下标的链表里面,查找的时候如果对应下标里面链表有多个值,依次和原文比对是否相等
2 开放地址法探测法(据说python用的正种)
同样是数组,同样是哈希取取模,如果下标已经有位置,那么久依次放到后面一个格子里面去,如果还是有,继续找下一个,知道找到空的位置放。
查询的时候,算出hash值,对比原文相等就返回,不等就找下一个,如果下一个是空,就表示找不到,如果下一个不是空就继续下一个,直到找到为止。
开发地址法有多个变种,他们都是堆下下一个的步长做了优化。
线探测:步长是1,逐步增加。
平方探测法:步长按照平方增加。
二次哈希:步长是由另外一个hash函数取模数组长度决定。
优缺点:
开放链表法:占用空间小,性能只有在链表里面有大量数据才开始慢慢线性衰减。
开发地址探测法:数组空间不到一半的时候效率高,数组空间接近满的时候遍历速度急剧下降,甚至查找一个对象遍历整个数组。并且最多只能装数组长度个对象。
很明显开发链表法个各便都有优势。据说python里面的hash结构用的开放地址探测法额缘由不得而知,不用Python,所以没有去验证具体用的什么算法。
这篇关于hash 碰撞的2种解决办法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南