哈希碰撞

2023-11-03

一、什么是哈希碰撞

所谓哈希(hash),就是将不同的输入映射成独一无二的、固定长度的值(又称"哈希值")。它是最常见的软件运算之一。如果不同的输入得到了同一个哈希值,就发生了"哈希碰撞"(collision)。

二、哈希碰撞产生原理

举个例子,假设要将某些元素存放在长度length,则其中某一个元素的key值为k,则其哈希值hash的计算公式为:

hash = (k)%length

假设length = 16,那么两个不同元素的key值分别为12和28,那么他们所取得的hash值都等于12,这就造成冲突了。

三、解决方法

1.开放地址法
开放地址法有一个公式:

Hi = H((key)+di) % m (i = 1,2,3,...,k)  (k <= m-1)

其中,m为哈希表的表长,di是产生冲突时的增量序列。
①线性探查法
当didi取值为1,即为线性探查法,每次冲突后,向后移动一个位置。
基本思想
将散列表T[0…m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:d,d+l,d+2,…,m-1,0,1,…,d-1即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止。
探查过程终止于三种情况:
(1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);
(2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;
(3)若探查到T[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满)。
缺点

  1. 处理溢出需另编程序。
  2. 按上述算法建立起来的哈希表,删除工作非常困难。假如要从哈希表 HT 中删除一个记录,按理应将这个记录所在位置置为空,但我们不能这样做,而只能标上已被删除的标记,否则,将会影响以后的查找。
  3. 线性探测法很容易产生堆聚现象。所谓堆聚现象,就是存入哈希表的记录在表中连成一片。按照线性探测法处理冲突,如果生成哈希地址的连续序列愈长 ( 即不同关键字值的哈希地址相邻在一起愈长 ) ,则当新的记录加入该表时,与这个序列发生冲突的可能性愈大。因此,哈希地址的较长连续序列比较短连续序列生长得快,这就意味着,一旦出现堆聚 ( 伴随着冲突 ) ,就将引起进一步的堆聚。

②线性补偿探测法
将线性探测的步长从 1 改为 Q ,即将上述算法中的 j = (j + 1) % m 改为: j = (j + Q) % m ,而且要求 Q 与 m 是互质的,以便能探测到哈希表中的所有单元。

③随机探测法
将线性探测的步长从常数改为随机数,即令: j = (j + RN) % m ,其中 RN 是一个随机数。在实际程序中应预先用随机数发生器产生一个随机序列,将此序列作为依次探测的步长。这样就能使不同的关键字具有不同的探测次序,从而可以避 免或减少堆聚。基于与线性探测法相同的理由,在线性补偿探测法和随机探测法中,删除一个记录后也要打上删除标记。

2.再哈希法
这种方法是同时构造多个不同的哈希函数:

 Hi=RH1(key)  i=12,…,k

当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

3.链地址法(拉链法)
可以理解为数组+链表,即在一个线性数组里的每一个元素存储一个链表的头结点。例如:, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,则进行B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C。也就是说数组中存储的是最后插入的元素。
优点:
① 拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
② 由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
③ 开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
④ 在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。
缺点:
指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈希碰撞 的相关文章

随机推荐

  • Java网络编程(四) Reactor和Proactor模式

    size medium 在高性能的I O设计中 有两个比较著名的模式Reactor和Proactor模式 其中Reactor模式用于同步I O 而Proactor运用于异步I O操作 color blue b 同步和异步 b color 同
  • 数据仓库与数据挖掘(一)

    1 简述数据仓库有哪些特征 面向主题 集成 稳定性即非易失的 随时间而变化即时变的 2 简述数据仓库与传统数据库的主要区别 一个是数据库 一个是数据仓库 就不是一个东西 怎么区别嘛 数据仓库是建立在数据库之上的一个数据环境 3 为什么需要分
  • Linux下监测网卡状态

    目录 1 说明 2 解析命令法 2 1 CODE 2 2 TEST 3 SOCKET法 1 说明 此代码主要对Linux下网卡4种状态进行检测 可以检查 网卡是否存在 网卡是否down 网卡UP 插了网线 RUNNING 网卡UP 没有插网
  • k8s nginx .yaml 测试

    apiVersion apps v1 kind Deployment metadata name nginx test spec replicas 2 selector matchLabels app nginx test template
  • c++中,什么时候用 A a;和什么时候用A a=new A;

    说明 此处内容是在网上摘抄的 总结一下 为了以后查找方面 new是在堆上分配内存 它需要用delete释放 否则会造成内存泄漏 使用的内存没有即时释放 造成内存的浪费 而A a在右大括号执行后 会自动释放内存 如 int main A a
  • Matlab funnction函数定义及常见扩展应用(@函数句柄,feval函数等)

    目录 MATLAB函数定义 1 函数文件 调用函数文件 定义多个M文件 2 函数文件 子函数 定义一个具有多个子函数的M文件 3 Inline 无需M文件 直接定义 4 匿名函数 5 Syms subs 无需M文件 直接定义 6 字符串 s
  • 数据持久化(Json,二进制,PlayerPrefs)

    数据持久化 文章目录 数据持久化 数据持久化概述 1 数据持久化 JSON 1 Json简介 2 JsonUtility相关知识点 3 LitJson相关知识 4 JsonMgr管理器的书写 2 数据持久化 二进制 1 二进制简介 2 文件
  • Nodejs之Buffer数据转ReadSteam

    当要处理的是一个文件时 stream fs createReadStream content txt 返回一个readStream 文件读取流 输入流 对象 可读流 当处理的是一个Buffer时 用createReadStream就会报错
  • 移动端接口加密

    最近公司写的android接口需要加密 防止被恶意攻击 2加密规则想了个简单的办法 传两个参数 一个是string类型的另一种是MD5加密的密文 在服务端写个拦截器 或者过滤器去拦截他 然后做自己相应的逻辑处理 把string类型的字段拿过
  • 操作系统进程知识概括

    操作系统进程知识概括 进程概述 线程 处理机调度 进程同步 进程互斥 信号量机制 进程互斥同步经典问题 管程 死锁 进程概述 进程概述 程序 是静态的 就是个存放在磁盘里的 可执行文件 就是一系列的指令集合 进程 Process 是动态的
  • OnnxRunTime遇到FAIL : Non-zero status code returned while running BatchNormalization node.

    遇到FAIL Non zero status code returned while running BatchNormalization node 跑onnxruntime时 发现显卡没有用到 pip install onnxruntim
  • Linux中的ssize_t

    2023年7月12日 周三上午 概述 ssize t 是一个数据类型 用于表示有符号的大小 它通常在文件操作和网络编程中用作函数的返回类型或参数类型 头文件 ssize t 在
  • EasyPoi导出 导入(带校验)简单示例 EasyExcel

    官方文档 http doc wupaas com docs easypoi pom的引入
  • 厉害了!知道这样重命名文件都是大佬级别!

    大家好 我是良许 在 Linux 下 重命名一个文件 我们通常是使用 mv 命令 一般是这样操作的 mv file1 txt file2 txt 这样重命令的方式当然是可以 但有个弊端就是你需要输入两次文件名 文件名比较短还好 一旦比较长的
  • zotero 使用方法

    zotero 使用方法总结 前言 zotero 免费开源 功能强大 插件丰富 使用方便 zotero支持多种方式导入文件包括直接拖拽pdf导入文档 DOI arXiv号或从剪切板导入 同时能够使用sci hub 文献下载神器 下载参考文献
  • springboot项目中使用Swagger

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 1 Swagger是啥 Swagger 是一个用于生成 描述和调用 RESTful 接口的 Web 服务 通俗的来讲 Swagger 就是将项目中所有 想要暴露的 接口展现在
  • 【Jmeter】调用java接口进行压测报no cookies问题

    Jmeter 调用java接口进行压测报no cookies问题 问题图片 解决办法 问题图片 解决办法 我的java接口返回参数是json格式 所以要选择如下图所示 最终返回正确的json格式 不在有no cookies问题
  • 线性分类模型(二):logistic回归模型分析

    前言 上一篇文章介绍了线性判别模型 本文介绍线性生成模型 logistic回归模型 本文介绍logstic回归模型相关的知识 为了更好理解模型的决策边界函数 本文同时分析了多元变量的协方差对概率分布的影响 目录 1 logistic回归模型
  • java内存模型

    https www cnblogs com chenpi p 5159558 html
  • 哈希碰撞

    一 什么是哈希碰撞 所谓哈希 hash 就是将不同的输入映射成独一无二的 固定长度的值 又称 哈希值 它是最常见的软件运算之一 如果不同的输入得到了同一个哈希值 就发生了 哈希碰撞 collision 二 哈希碰撞产生原理 举个例子 假设要