哈希冲突和哈希冲突攻击解析
一、什么是哈希冲突?
当数据插入到哈希表时,不同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冲突实例 - 风雪之隅
哈希冲突和哈希冲突攻击解析相关推荐
- 用开放地址法中的线性探查法解决冲突实现哈希表的运算
为了更深的理解哈希算法,自己写了用开放地址法中的线性探查法解决冲突实现哈希表的运算. /*** Created by lirui on 14-8-13.* 用开放地址法中的线性探查法解决冲突实现哈希表 ...
- 趣谈哈希表优化:从规避 Hash 冲突到利⽤ Hash 冲突
导读:本文从哈希表传统设计与解决思路入手,深入浅出地引出新的设计思路:从尽量规避哈希冲突,转向了利⽤合适的哈希冲突概率来优化计算和存储效率.新的哈希表设计表明 SIMD 指令的并⾏化处理能⼒的有效应⽤ ...
- 高级数据结构与算法 | 哈希 :哈希冲突、负载因子、哈希函数、哈希表、哈希桶
文章目录 哈希 哈希函数 常见的哈希函数 字符串哈希函数 哈希冲突 闭散列的解决方法 开散列的解决方法 负载因子以及增容 对于闭散列 对于开散列结构 具体实现 哈希表(闭散列) 插入 查找 删除 完整 ...
- 哈希表及哈希冲突解决办法
哈希表及哈希冲突解决办法 目录 什么是哈希表? 哈希表的数据结构 哈希冲突 哈希冲突解决办法 1. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直 ...
- 数据结构:哈希表函数构造和冲突解决方法
哈希表 哈希函数:记录的存储位置和它的关键字之间建立一个确定的对应关系. 冲突:对不同的关键字可能得到同一哈希地址,这种现象称为冲突. 哈希函数构造方法 1.直接定址法 取关键字或关键字的某个线性函数 ...
- python字典实现原理-哈希函数-解决哈希冲突方法
python字典实现原理-哈希函数-解决哈希冲突方法 参考文章: (1)python字典实现原理-哈希函数-解决哈希冲突方法 (2)https://www.cnblogs.com/guyannanfe ...
- 哈希表构造与处理冲突方法
我们知道:哈希表是一个固定大小的数组,数组的每个元素是一个链表(单向或双向)的头指针.如果Key一样,则在一起,如果Key不一样,则不在一起.哈希表的查询是飞快的.因为它不需要从头搜索,它利用Key的 ...
- Hash函数与算法、哈希查找、哈希冲突解决方法总结
Hash哈希知识点导航 1.基本概念 2. 哈希函数 2.1 直接寻址法 2.2 数字分析法 2.3 平方取中法 2.4 折叠法 2.5 随机数法 2.6 除留余数法 3. 哈 ...
- 【Java】哈希冲突(哈希碰撞)
文章目录 为什么发生哈希冲突(哈希碰撞) 能否完全避免哈希冲突 常用处理哈希冲突的方法 1.开放地址法 1.1线性探测再散列 缺点:二次聚集 1.2二次探测再散列 1.3伪随机探测再散列 2.再哈希地 ...
- 哈希表及哈希冲突的解决
哈希表(也叫关联数组)一种通用的数据结构,哈希表是一种通过关键码去寻找值得数据映射结构 例:新华字典.如果我想知道"按"的详细信息,根据拼音去查找拼音索引,首先查找"an ...
最新文章
- 2020 年 6 月编程语言排行榜,C 稳居第一,Rust 首进 Top 20!
- LAMP搭建UCenter
- kafka的使用场景(转载+自己笔记)
- S3C2440时钟体系
- 一步步编写操作系统 14 CPU与外设通信——IO接口 上
- 组合数学 —— 卡特兰数列(Catalan)
- thymeleaf 中select下拉回显
- 手机短号(hdu2081)
- 【只推荐一位】他自学成才,坐拥38w粉丝,技术第一大号!
- vi/vim 基本使用方法
- java安装教程详细
- 短视频源码应该优化的六个方面
- java 找不到符号
- zabbix Event acknowledgment事件确认
- 1.U3D和U3D安装介绍
- UI设计中线面结合图标设计总结
- java图形打字机_Android模仿打字机效果的自定义View实现
- 什么是最优化问题(Optimization Problem)?
- 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)...
- 远程直播服务器连接失败,哔哩哔哩直播姬连接失败如何解决 直播姬连接失败解决方法攻略大全...