1、哈希函数 2、哈希碰撞 3、哈希函数怎么计算哈希值

哈希函数(Hash Function)是一种将输入数据映射为固定长度哈希值的函数。它接受任意长度的输入,但输出的哈希值长度是固定的。哈希函数的主要目的是将输入数据压缩成较短的哈希值,并且具有以下特性:

  1. 一致性:相同的输入始终产生相同的哈希值。
  2. 高效性:计算哈希值的过程应该是高效的。
  3. 雪崩效应:输入数据的微小变化会导致输出哈希值的巨大变化。
  4. 均匀分布:哈希函数应该尽可能地将输入数据均匀地映射到哈希值空间中。

在实际应用中,哈希函数经常被用于数据加密、数据完整性校验、数据索引等场景。常见的哈希函数包括MD5、SHA-1、SHA-256等。需要注意的是,由于哈希函数的特性限制,可能会存在不同的输入产生相同的哈希值(称为哈希碰撞),因此在某些安全性要求较高的场景中,需要采取额外的措施来处理这种情况。

哈希碰撞(Hash Collision)指的是不同的输入数据经过哈希函数计算后,可能会产生相同的哈希值。换句话说,两不同的输入数据具有相同的哈希值。由于哈希函数将输入数据映射到固定长度的哈希值空间中,而输入数据的可能性是无限的,因此哈希碰撞是不可避免的。

哈希碰撞可能会引发一些问题。例如,在使用哈希函数实现的数据结构中,如哈希表(HashMap)或哈希集合(HashSet),如果发生碰撞,则会导致数据存储和检索的性能下降。此外,哈希碰撞也可能被恶意利用来进行一些安全攻击,如哈希碰撞攻击(Hash Collision Attack)。

为了应对哈希碰撞,通常采取以下策略之一:

  1. 增加哈希值空间:使用更大的哈希值空间可以降低发生碰撞的概率。
  2. 良好设计的哈希函数:选择一个具有较低碰撞概率的哈希函数。
  3. 开放定址法:当发生碰撞时,通过一定的规则在哈希表中找到另一个可用位置来存储数据。
  4. 链接法:使用链表或其他数据结构在哈希表的每个槽位上存储多个元素。

综合考虑数据量、性能和安全性等因素,选择适当的哈希函数和解决碰撞的方法是很重要的。

哈希函数怎么计算哈希值?

首先,根据哈希函数 h(key) = key mod 7,可以得到每个关键字的哈希地址:

9 mod 7 = 2 1 mod 7 = 1 23 mod 7 = 2 14 mod 7 = 55 mod 7 = 6 20 mod 7 = 6 84 mod 7 = 27 mod 7 = 6

接下来,采用开放地址法的线性探测再散列方法解决冲突,即如果某个关键字的哈希地址已经被占用,就往后探测,直到找到一个空闲的位置为止。具体过程如下:

  1. 将关键字 9 存放在地址 2 处。
  2. 将关键字 1 存放在地址 1 处。
  3. 将关键字 23 存放在地址 3 处。
  4. 将关键字 14 存放在地址 处。
  5. 将关键字 55 存放在地址 6 处。
  6. 由于地址 6 已经被占用,线性探测到地址 7,发现地址 7 也被占用,继续线性探测到地址 8,发现地址 8 为空,将关键字 20 存放在地址 8 处。
  7. 由于地址 已经被占用,线性探测到地址 1,发现地址 1 已经被占用,继续线性探测到地址 2,发现地址 2 已经被占用,继续线性探测到地址 3,发现地址 3已经被占用,继续线性探测到地址 4,发现地址 4 已经被占用,继续线性探测到地址 5,发现地址 5 已经被占用,继续线性探测到地址 6,发现地址 6 已经被占用,继续线性探测到地址 7,发现地址 7 已经被占用,继续线性探测到地址 8,发现地址 8 已经被占用,继续线性探测到地址 9,发现地址 9 为空,将关键字 27 存放在地址 9 处。

此时,哈希表的地址--9单元的值为:

: 14 1: 1 2: 9 3: 23 4: 5: 6: 55 7: 8: 20 9: 27

接下来计算查找成功和失败的平均查找长度:

查找成功的平均查找长度 = 所有查找成功的关键字的查找长度之和 / 查找成功的关键字个数

查找失败的平均查找长度 = 所有查找失败的关键字的查找长度之和 / 查找失败的关键字个数

假设要查找的关键字为 x,先计算它的哈希地址 h(x):

h( x ) = x mod 7

假设要查找的关键字为 14,它的哈希地址为 ,直接在地址 处找到了,查找长度为 1。

假设要查找的关键字为 27,它的哈希地址为 6,由于地址 6 已经被占用,线性探测到地址 7,发现地址 7 为空,但是地址 7 之后的所有地址都已经被占用了,因此查找失败,查找长度为 3。

假设要查找的关键字为 10,它的哈希地址为 3,由于地址 3 已经被占用,线性探测到地址 4,发现地址 4 为空,但是地址 4 之后的所有地址都已经被占用了,因此查找失败,查找长度为 2。

假设要查找的关键字为 84,它的哈希地址为 ,由于地址 已经被占用,线性探测到地址 1,发现地址 1 已经被占用,继续线性探测到地址 2,发现地址 2 已经被占用,继续线性探测到地址 3,发现地址 3已经被占用,继续线性探测到地址 4,发现地址 4 已经被占用,继续线性探测到地址 5,发现地址 5 已经被占用,继续线性探测到地址 6,发现地址 6 已经被占用,继续线性探测到地址 7,发现地址 7 已经被占用,继续线性探测到地址 8,发现地址 8 已经被占用,继续线性探测到地址 9,发现地址 9 为空,但是地址 9 之后的所有地址都已经被占用了,因此查找失败,查找长度为 10。

因此,查找成功的平均查找长度为 (1+1+1) / 3 = 1,查找失败的平均查找长度为 (3+2+10) / 3 = 5。

哈希表地址--9单元的值为:

: 14 1: 1 2: 9 3: 23 4: 5: 6: 55 7: 8: 20 9: 27

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值