hash碰撞处理方法

article/2025/9/22 18:22:34

目录

哈希表

哈希冲突

解决碰撞方法

1、开放定址法

a)、线性探测法

a)、二次探测法

c)伪随机探测

2、再哈希法

3、拉链法

4、建立公共溢出区 


哈希表

是一种实现关联数组抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。
简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值

哈希冲突

当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时,即称为发生了哈希冲突。简单来说就是哈希函数算出来的地址被别的元素占用了

解决碰撞方法

1、开放定址法

出现冲突后按照一定算法查找下一个空位置

公式:H(x) = (hash(x) + d_{i}) mod m;  其中i=1,2,...m-1

优点:容易系列化

缺点:占用空间大。为减少冲突,要求装填因子d较小,故当结点规模较大时会浪费很多空间,其次不能真正的删除,不能简单的将删除节点位置置空,会影响到其他同义词节点的查找路劲,只能在被删节点上做删除标记。 节点规模大时效率低。

a)、线性探测法

公式:H(x) = (hash(x) + d_{i}) mod m; d = 1,2,3...m-1;(d为递增加1)
若哈希函数算出来的位置被占了,则对i一直加知道再次计算出哈希函数值位置不被占用

ThreadLocalMap就是使用该方法

举个栗子:0, 1, 2, 6, 7, 8

hash值
0h(0) = 0 % 6 = 0
1h(1) = 1 % 6 = 1
2h(2) = 2 % 6 = 2
6

h(6) = 6 % 6 = 0  被占用

h(6) = (6 + 1) % 6 = 1  被占用

h(6) = (6 + 2) % 6 = 2  被占用

h(6) = (6 + 3) % 6 = 3 

7

h(7) = 7 % 6 = 1  被占用

h(7) = (7 + 1) % 6 = 2  被占用

h(7) = (7 + 2) % 6 = 3  被占用

h(7) = (7 + 3) % 6 = 4

8

h(8) = 8 % 6 = 2  被占用

h(8) = (8 + 1) % 6 = 3  被占用

h(8) = (8 + 2) % 6 = 4  被占用

h(8) = (8 + 3) % 6 = 5

a)、二次探测法

又名平方探测法,若计算出的哈希值位置被占了,会前后寻找而不是单独方向的寻找。

公式:H(x) = (hash(x) + d_{i}) mod m; (d依次为+(i^2)和-(i^2),i每次递增+1

举个栗子:0, 1, 2,3,5

0h(0) = 0 % 5 = 0
1h(1) = 1 % 5 = 1
2h(2) = 2 % 5 = 2
3h(3) = 3 % 5 = 3
5

h(5) = 5 % 5 = 0 被占用

h(5) = (5 + 1^2) % 5 = 1  被占用

h(5) = (5 + (-1^2)) % 5 = 4  

c)伪随机探测

随机产生一个增量位移

公式:H(x) = (hash(x) + d_{i}) mod m; (d为伪随机位数列)

举个栗子:0, 8, 11,伪随机位数列为3,7,11...

0h(0) = (0+3) % 3 = 0
1h(8) = (8+3) % 3 = 2
2

h(11) = (11+3) % 3 = 2 被占用

h(11) = (11+7) % 3 = 0 被占用

h(11) = (11+11) % 3 = 1

2、再哈希法

再哈希法,又叫双哈希法,用多个不同的Hash函数,出现冲突后采用其他的哈希函数计算,直到不再冲突为止

优点:不易发生聚集

缺点:增加了计算时间

H(x) = RHash(x) mod length

比如:H(10) = 10 * 3.1415926 * x % 10 使用了多个乘法hash函数

3、拉链法

将具有相同哈希地址的记录链成一个单链表,m个哈希地址就设m个单链表,然后用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构

hashMap就是这个方法

优点:

1、拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;

2、由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;

3、当结点规模较大时,拉链法中增加的指针域可忽略不计,因此节省空间;

4、在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。

缺点:

1、节点规模小时,指针占用较大空间时,相比于其他方法会造成空间浪费

举个栗子:集合{47,7,29,11,16,92,22,8,3,50,37,89},m = 11,

哈希算法为H(k) = k mod 11,则建表如下图

4、建立公共溢出区 

创建哈希表时,将所有产生冲突的的同义词集中另外在放在一个溢出表中

举个栗子:

集合{26,36,41,38,44,15,68,12,6,51,25},m = 12,

哈希函数:H(k)= k mod 12,则哈希表如下:

 有哈希冲突的,另外都放到溢出表


http://chatgpt.dhexx.cn/article/Y6crO2Ov.shtml

相关文章

通俗讲解哈希表,哈希碰撞问题!

哈希表是个啥? 小白: 庆哥,什么是哈希表?这个哈希好熟悉,记得好像有HashMap和HashTable之类的吧,这是一样的嘛?😊 庆哥: 这个哈希确实经常见😂,足…

哈希碰撞是个什么鬼?

什么是哈希算法? 哈希算法,也叫哈希函数,散列函数,是将任意长度的二进制值映射为较短的固定长度的二进制值,即哈希值。哈希算法是一种只能加密,不能解密的特殊算法。 什么是哈希碰撞? 如果不…

哈希值与哈希碰撞

哈希碰撞 一、什么是哈希? 哈希(hash)就是讲不同的输入,映射成独一无二、固定长度的值,既哈希值。 我们可以理解为商品的条形码。任何商品都会有一个固定长度而又固定的条码。它的作用就类似于哈希。 哈希值长度可…

【Java】哈希冲突(哈希碰撞)

文章目录 为什么发生哈希冲突(哈希碰撞)能否完全避免哈希冲突常用处理哈希冲突的方法1.开放地址法1.1线性探测再散列缺点:二次聚集 1.2二次探测再散列1.3伪随机探测再散列 2.再哈希地址法3.链地址法4.建立公共溢出区 为什么发生哈希冲突&…

什么是哈希,哈希表,哈希函数,哈希碰撞?

什么是哈希? 比方我有个原始值,S[“老铁双击666”,‘感谢老铁送的飞机’], 通过某种算法(比如java的hasecode(获得变量的物理地址))得到的666这个就是“哈希码“(将字符串转换成尽可能不重复的int类型数字…

解决哈希碰撞的方法

什么是hash表 根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或…

公网IP/内网IP:

转自:http://hi.baidu.com/qkjzsjqsehailte/item/1042151cc0959f426926bbb4 IP地址分配 IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的:网络号和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同…

公网ip、内网ip

首先解释一下“内网”与“外网”的概念: 内网:即所说的局域网,比如学校的局域网,局域网内每台计算机的IP地址在本局域网内具有互异性,是不可重复的。但两个局域网内的内网IP可以有相同的。 外网:即互联网&a…

什么是公网IP和内网IP?

1、引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢?另外,内行都知道&#xff0c…

内网地址与公网地址及作用

下个礼拜就要过年喽 每天离假期更近了一步,就充满了动力 大家回家路上也要注意防护安全哦 ———————————————————— 一般内网指的就是我们园区内网,用的地址一般都是私有地址 私有地址在RFC1918草案中被提到,指的就是10…

java如何获得内网ip、外网ip、以及如何根据ip查询地址

今天突发奇想地想要用java写一个小的工具类。 用来实现如何获得本机的内网ip,外网ip和根据ip获得相应的地址。 花了几个小时才弄清,然后整理了一下,希望有用。 首先要明白以下三种ip地址的区别: (1)127.0.0…

简单介绍 内网与外网IP地址,域名,子网掩码,网关与路由器,ping

IP地址 IP地址是在网络给主机分配的地址如53.159.232.5或者192.168.1.1 。具体格式就是00000000.00000000.00000000.00000000,32位二进制,平时都用十进制。 但是主机在网络上不是一个主机连一个主机,而是网络连接网络,在一个网络…

局域网固定内网IP地址的方法(亲测有效)

公司有十来台电脑,想要做文件共享,但是碍于内网IP经常变动共享文件很不方便。 网上查了一些资料,局域网中的电脑ip若不是设置固定的话,一般都是动态获取的ip,若是需要固定ip,那要如何设置呢? 经…

查询自己的IP地址(内网和外网)

查询自己的内网IP和外网IP的方法,以及判断是否直接连接到公网 本方法使用命令行,无需其他软件 内网IP,即局域网IP: 打开cmd窗口,输入 ipconfig 后回车 IPv4地址一栏下即为内网IP,我的电脑是192.168.3.19 顺…

192.168.和10.0.开头的IP、内网IP段、IP简介、分类——(IP观止)

在这三类地址中,绝大多数的IP地址都是公有地址,需要向国际互联网信息中心申请注册。但是在IPv4地址协议中预留了3个IP地址段,作为私有地址,供组织机构内部使用。 这三个地址段分别位于A、B、C三类地址内: A类地址&…

VS2019安装+IVF2020安装+abaqus2021安装+关联(亲测有效附安装包)

VS2019安装IVF2020安装abaqus2021安装关联(亲测有效附安装包) 0. 说明1. 安装与汉化abaqus20211.1 下载解压安装包1.2 参考以下链接的安装步骤安装1.3 安装注意事项和提示 2. VS2019安装IVF2020安装2.1 下载解压VS2019在线安装包2.2 安装配置VS20192.3 下…

abaqus一维固结模拟

初学者学习ABAQUS时,真可谓一头雾水,为什么? 第一因为它是全英文界面(不过这是可以汉化的哦);第二因为它是有限元分析软件,俗称“CAE”即计算机辅助求解分析复杂工程(不同于CAD即计算…

Abaqus安装在lincense server1出错

问题描述:LMtools显示启动成功,但是安装abaqus时填写过License Server1后测试链接不上 原因:Lincense server1中应为27011主机名(格式不要错了),而我输入成了27500主机名(原因是找的一个安装教程…

基于Python向Abaqus导入txt、dat数据(附abaqus中python二次开发课程)

这次推送聚焦于解决采用Python向Abaqus里导入txt、dat数据的问题(dat文件只需要将txt文件的后缀名改为dat就可以生成dat文件),Abaqus基于Python读入txt、dat数据主要有read()、readlines()、readlines()、numpy.loadtxt()函数,导入…