一、什么是哈希冲突?

当数据插入到哈希表时,不同key值产生的h(key)却是相等的,这个时候就产生了冲突。

二、怎么解决哈希冲突?

常用的几种方法有:开放定址法、拉链法、再哈希法、建立公共溢出区。

1、开放定址法

所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入 
公式为:fi(key) = (f(key)+di) MOD m (di=1,2,3,……,m-1)

详解:当冲突发生时,使用某种探测技术在散列表中形成一个探测序列(根据生成序列的规则不同,可以有线性探查法、伪随机探查法、二次探查法、双散列法等)。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。

比如说(借用例子),我们的关键字集合为{12,67,56,16,25,37,22,29,15,47,48,34},表长为12。 我们用散列函数f(key) = key mod l2 
当计算前S个数{12,67,56,16,25}时,都是没有冲突的散列地址,直接存入:

 
计算key = 37时,发现f(37) = 1,此时就与25所在的位置冲突。 
于是我们应用上面的公式f(37) = (f(37)+1) mod 12 = 2。于是将37存入下标为2的位置: 

2、拉链法

拉链法是解决哈希冲突的一种行之有效的方法(比如php、java就是使用该方法解决哈希冲突),某些哈希地址可以被多个关键字值共享,这样可以针对每个哈希地址建立一个单链表。

原理:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表连接起来。

如(借用例子): 键值对k2, v2与键值对k1, v1通过计算后的索引值都为2,这时及产生冲突,但是可以通道next指针将k2, k1所在的节点连接起来,这样就解决了哈希的冲突问题 

3、再哈希法

再哈希法理解起来比较简单,再哈希法又叫双哈希法,有多个不同的Hash函数,当发生冲突时,就可以使用第二个函数、如果在发生冲突继续使用第三个函数、以此类推,一直到无冲突为止,再哈希法虽然不容易发生聚集,但是大大增加了计算时间。

4、建立公共溢出区

原理:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

三、利用哈希冲突来进行攻击

上面我提到,php和java之类的语言用的就是拉链法解决哈希冲突的。

其攻击原理就是:构造恶意的数据使hash表退化为链表,每次插入数据都会遍历链表,消耗大量服务器资源,从而达到攻击目的。

例如:php的数组就是利用hash表实现的,下面用例子看看恶意构造的数据和普通数据的区别

    <?php$size = pow(2, 16);$startTime = microtime(true);$array = array();for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {$array[$key] = 0;}$endTime = microtime(true);echo '插入 ', $size, ' 个恶意的元素需要 ', $endTime - $startTime, ' 秒', "\n";$startTime = microtime(true);$array = array();for ($key = 0, $maxKey = $size - 1; $key <= $maxKey; ++$key) {$array[$key] = 0;}$endTime = microtime(true);echo '插入 ', $size, ' 个普通元素需要 ', $endTime - $startTime, ' 秒', "\n";

上面的例子, 就是恶意构造数据,导致每次数据的写入都产生了哈希冲突,导致每一次存入就会遍历整个链表,在我的机器上的执行结果如下:

(这是我机器配置高一些,还有就是php7优化了hash表的结构和算法,如果用的php5.6,时间会更久)

插入 65536 个恶意的元素需要 7.9304070472717 秒
插入 65536 个普通元素需要 0.0048370361328125 秒

可参考鸟哥博客地址:PHP数组的Hash冲突实例 - 风雪之隅

哈希冲突和哈希冲突攻击解析相关推荐

  1. 用开放地址法中的线性探查法解决冲突实现哈希表的运算

    为了更深的理解哈希算法,自己写了用开放地址法中的线性探查法解决冲突实现哈希表的运算. /*** Created by lirui on 14-8-13.* 用开放地址法中的线性探查法解决冲突实现哈希表 ...

  2. 趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突

    导读:本文从哈希表传统设计与解决思路入手,深入浅出地引出新的设计思路:从尽量规避哈希冲突,转向了利⽤合适的哈希冲突概率来优化计算和存储效率.新的哈希表设计表明 SIMD 指令的并⾏化处理能⼒的有效应⽤ ...

  3. 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶

    文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...

  4. 哈希表及哈希冲突解决办法

    哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...

  5. 数据结构:哈希表函数构造和冲突解决方法

    哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...

  6. python字典实现原理-哈希函数-解决哈希冲突方法

    python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...

  7. 哈希表构造与处理冲突方法

    我们知道:哈希表是一个固定大小的数组,数组的每个元素是一个链表(单向或双向)的头指针.如果Key一样,则在一起,如果Key不一样,则不在一起.哈希表的查询是飞快的.因为它不需要从头搜索,它利用Key的 ...

  8. Hash函数与算法、哈希查找、哈希冲突解决方法总结

    Hash哈希知识点导航 1.基本概念 2. 哈希函数   2.1 直接寻址法   2.2 数字分析法   2.3 平方取中法   2.4 折叠法   2.5 随机数法   2.6 除留余数法 3. 哈 ...

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

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

  10. 哈希表及哈希冲突的解决

    哈希表(也叫关联数组)一种通用的数据结构,哈希表是一种通过关键码去寻找值得数据映射结构 例:新华字典.如果我想知道"按"的详细信息,根据拼音去查找拼音索引,首先查找"an ...

最新文章

  1. 2020 年 6 月编程语言排行榜,C 稳居第一,Rust 首进 Top 20!
  2. LAMP搭建UCenter
  3. kafka的使用场景(转载+自己笔记)
  4. S3C2440时钟体系
  5. 一步步编写操作系统 14 CPU与外设通信——IO接口 上
  6. 组合数学 —— 卡特兰数列(Catalan)
  7. thymeleaf 中select下拉回显
  8. 手机短号(hdu2081)
  9. 【只推荐一位】他自学成才,坐拥38w粉丝,技术第一大号!
  10. vi/vim 基本使用方法
  11. java安装教程详细
  12. 短视频源码应该优化的六个方面
  13. java 找不到符号
  14. zabbix Event acknowledgment事件确认
  15. 1.U3D和U3D安装介绍
  16. UI设计中线面结合图标设计总结
  17. java图形打字机_Android模仿打字机效果的自定义View实现
  18. 什么是最优化问题(Optimization Problem)?
  19. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)...
  20. 远程直播服务器连接失败,哔哩哔哩直播姬连接失败如何解决 直播姬连接失败解决方法攻略大全...

热门文章

  1. 大话数据结构 【六】串
  2. Phony Targets
  3. 第九章、文件与文件系统的压缩与打包
  4. 春风吹,战鼓擂,忆享科技-云服务事业部春季员工关怀活动集锦,温情相伴
  5. Eclipse 中重新定位SVN服务器地址
  6. 计算机网络什么是互联网什么是网速,网速慢是什么原因,怎么解决?
  7. 最好的pdf转换成word转换器在线
  8. 中国政府版 Windows 10 开发完成,即将大规模推广
  9. C#--配置文件Web.config,数据库连接串 ConnectionStrings和AppSettings的区别
  10. 百度语音助手实现多回合回话的技术分析