hash和hash碰撞以及解决方案

article/2025/9/22 17:38:13

hash:

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

hash碰撞:

如果两个输入串的hash函数的值一样,则称这两个串是一个碰撞(Collision)。既然是把任意长度的字符串变成固定长度的字符串,所以必有一个输出串对应无穷多个输入串,碰撞是必然存在的。一个优良的hash函数 f 应当满足以下三个条件:

(1)对于任意y,寻找x,使得f(x)=y,在计算上是不可行的。

(2)给定x1∈A,找x2∈B,,使得f(x1)=f(x2),在计算上是不可能的,这也就是弱无碰撞性。

(3)寻找x1,x2,使得f(x1)=f(x2),在计算上也是不可行的,这也就是强无碰撞性。

这样就称为安全保密的Hash函数,除了枚举外不可能有别的更快的方法。如第3条,根据生日定理,要想找到这样的x1,x2,理论上需要大约2^(n/2)的枚举次数。

因为前两条都能被破坏的hash函数太弱而被抛弃,几乎所有的hash函数的破解,都是指的破坏上面的第3条性质,即找到一个碰撞。在密码学上还有一个概念是理论破解,指的是提出一个算法,使得可以用低于理论值得枚举次数找到碰撞。

解决方法:

对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一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.链地址法(拉链法)

将所有关键字为同义词的记录存储在同一线性链表中。如下:


因此这种方法,可以近似的认为是筒子里面套筒子。

优点:

①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;
②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;
③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;
④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

缺点:

指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

4.建立一个公共溢出区

假设哈希函数的值域为[0,m-1],则设向量HashTable[0..m-1]为基本表,另外设立存储空间向量OverTable[0..v]用以存储发生冲突的记录。





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

相关文章

哈希碰撞攻击与防范机制

1.引子 哈希表的原理是用数组来保存键值对&#xff0c;键值对存放的位置&#xff08;下标&#xff09;由键的哈希值决定&#xff0c;键的哈希值可以在参数时间内计算出来&#xff0c;这样哈希表插入、查找和删除的时间复杂度为O(1)&#xff0c;但是这是理想的情况下&#xff0…

HashMap的实现原理及hash冲突(碰撞)解决方法

HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时&#xff0c;系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法&#xff0c;都可通过该方法获得它的 hashCode 值。得到这…

解决Hash碰撞冲突方法总结

Hash碰撞冲突 我们知道&#xff0c;对象Hash的前提是实现equals()和hashCode()两个方法&#xff0c;那么HashCode()的作用就是保证对象返回唯一hash值&#xff0c;但当两个对象计算值一样时&#xff0c;这就发生了碰撞冲突。如下将介绍如何处理冲突&#xff0c;当然其前提是一…

哈希表碰撞攻击的基本原理

原文地址&#xff1a;http://blog.jobbole.com/11516/ 来源&#xff1a;张洋 最近哈希表碰撞攻击&#xff08;Hashtable collisions as DOS attack&#xff09;的话题不断被提起&#xff0c;各种语言纷纷中招。本文结合PHP内核源码&#xff0c;聊一聊这种攻击的原理及实现。 …

hash碰撞处理方法

目录 哈希表 哈希冲突 解决碰撞方法 1、开放定址法 a)、线性探测法 a)、二次探测法 c&#xff09;伪随机探测 2、再哈希法 3、拉链法 4、建立公共溢出区 哈希表 是一种实现关联数组抽象数据类型的数据结构&#xff0c;这种结构可以将关键码映射到给定值。 简单来说…

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

哈希表是个啥&#xff1f; 小白&#xff1a; 庆哥&#xff0c;什么是哈希表&#xff1f;这个哈希好熟悉&#xff0c;记得好像有HashMap和HashTable之类的吧&#xff0c;这是一样的嘛&#xff1f;&#x1f60a; 庆哥&#xff1a; 这个哈希确实经常见&#x1f602;&#xff0c;足…

哈希碰撞是个什么鬼?

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

哈希值与哈希碰撞

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

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

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

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

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

解决哈希碰撞的方法

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

公网IP/内网IP:

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

公网ip、内网ip

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

什么是公网IP和内网IP?

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

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

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

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

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

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

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

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

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

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

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

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

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