hash碰撞解决方法
Hash碰撞冲突
我们知道,对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰撞冲突。如下将介绍如何处理冲突,当然其前提是一致性hash。
1.开放地址法
开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。
如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测再散列。
如果di取值可能为伪随机数列。称伪随机探测再散列。
2.再哈希法
当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止
3.链地址法(拉链法)
将所有关键字为同义词的记录存储在同一线性链表中。如下:
因此这种方法,可以近似的认为是筒子里面套筒子
4.建立一个公共溢出区
假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。
拉链法的优缺点:
优点:
①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。
缺点:
指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。
hash碰撞解决方法相关推荐
- 解决Hash碰撞冲突方法总结
https://blog.csdn.net/zeb_perfect/article/details/52574915 Hash碰撞冲突 我们知道,对象Hash的前提是实现equals()和hashCo ...
- HashMap的实现原理及hash冲突(碰撞)解决方法
HashMap 采用一种所谓的"Hash 算法"来决定每个元素的存储位置.当程序执行 map.put(String,Obect)方法 时,系统将调用String的 hashCode ...
- hash碰撞处理方法
目录 哈希表 哈希冲突 解决碰撞方法 1.开放定址法 a).线性探测法 a).二次探测法 c)伪随机探测 2.再哈希法 3.拉链法 4.建立公共溢出区 哈希表 是一种实现关联数组抽象数据类型的数据结构 ...
- HashMap之Hash碰撞
详细理解了Hash碰撞及处理方法 为什么会出现hash碰撞 在hash算法下,假设两个输入串的值不同,但是得到的hash值相同, 即会产生hash碰撞 一个很简单的例子: 假设你自己设计了一个计算ha ...
- HASH碰撞问题一直没真正搞懂?这下不用慌了
我是架构精进之路,点击上方"关注",坚持每天为你分享技术干货,私信我回复"01",送你一份程序员成长进阶大礼包. HASH算法介绍 散列函数(英语:Hash f ...
- 用链表和数组实现HASH表,几种碰撞冲突解决方法
Hash算法中要解决一个碰撞冲突的办法,后文中描述了几种解决方法.下面代码中用的是链式地址法,就是用链表和数组实现HASH表. he/*hash table max size*/ #define HA ...
- HashMap 中 hash 冲突的解决方法及原理分析
我们最先衰老的不是容貌,而是不顾一切的闯劲.有时候,要敢于背上超出自己预料的包袱,真的努力后,你会发现自己要比想象的优秀很多. HashMap冲突的解决方法比较考验一个开发者解决问题的能力. 在Jav ...
- hash冲突原理及解决方法
在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMa ...
- ThreadLocal源码阅读四:如何解决hash碰撞的?
背景 推荐阅读ThreadLocal工作过程 推荐阅读ThreadLocal的魔数引发的疑问与思考 什么样的使用场景会出现hash碰撞? 如何解决hash碰撞的? 过程 可能产生hash碰撞的场景 分 ...
- HASHMAP解决hash碰撞相关问题
1.封装类作为KEY,都是final类型保证hash值不可更改; 内部已经实现equals和hashcode方法,遵循hashmap内部规范计算准确性,有效减少hash碰撞的几率, 2.如果使用obj ...
最新文章
- hive金额怎么转换千位分隔符_金额字段加千位分隔符方法
- Matlab和Python(Numpy,Scipy)与Lapack的关系
- PHP Ajax 跨域问题最佳解决方案
- adf 自动输稿器_在ADF实体PK属性中使用MySQL自动增量PK列
- java hive配置_Hive配置项的含义详解(1)
- JS 表单、表单验证(表单判断、get、post、submit、validity、checkValidity)
- KPN iTV的敏捷转型之旅
- H3C PBR(策略路由)实验
- python3.4.3如何获取文件的路径
- C++--第16课 - 继承中的构造与析构
- 2008下mysql补丁_windows Server 2008 R2安装Mysql 8的打补丁顺序
- python入门教程
- DelayQueue浮光掠影
- arduino控制步进电机和舵机
- 五、服务总线 - Bus
- image caption
- Linux系统介绍:内核、shell及软件包管理
- 大学生竞赛管理系统-JAVA【数据库设计、源码、开题报告】
- 靠一己之力造就3个首富,丁磊、刘强东、宗庆后背后的神秘女人
- 有的工业互联网重于泰山,有的工业互联网轻于鸿毛
热门文章
- 华为 - 路由交换基础
- VMware虚拟机安装Linux教程(超详细)
- 无法启动程序因为计算机中丢失msvcr100,Win7系统计算机中Msvcr100.dll丢失的解决办法(两种方法)...
- php微信登陆流程,thinkphp微信授权登陆具体流程~
- QQ空间照片回收站在哪里,QQ隐藏的一些功能
- 小米手机切换应用--完美实现步骤
- 【云周刊】第121期:图管够!灌篮高手、女儿国…阿里日,这帮程序员太会玩了!...
- Nginx 局域网内互传文件
- 工控机运行linux,什么是linux嵌入式工控机
- PL/SQL程序设计 第八章 触发器