常见算法及问题场景——散列(哈希)

本文探讨了哈希函数的定义、评价体系,强调了冲突对效率的影响及处理策略,包括继续查找、链表法和公共溢出区。介绍了哈希在字符串、加密、信息摘要和几何匹配中的应用,并提到了布隆过滤器的特性及其在空间效率和查询时间上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

哈希函数按照定义可以实现一个伪随机数生成器(PRNG),从这个角度来看,哈希函数之间性能、质量等方面的比较,可以通过其在伪随机生成质量方面的比较来衡量。

评价体系:

1、泊松分布可以用于分析不同的哈希函数对不同的数据的碰撞率(collision rate)。
2、算法复杂度,以及运行时间。
3、位偏向。哈希函数生成随机位序列时,产生高、低位的位偏向应该各为50%。
4、完美的哈稀函数不存在,只能寻找特定数据集上最满意的函数。

冲突

1、冲突会影响效率。
2、三个影响冲突的因素:散列函数是否均匀、处理冲突的方法、散列表的装填因子(填入表中的元素个数 / 散列表的长度)。
3、常见冲突处理方案:继续寻找下一个散列地址、在当前位置使用链表保存、建立公共溢出区。

指导思想

1、对数据进行哈希操作,如加法、乘法、移位等操作变换,来产生哈希值。
2、无法证明素数的参与会使哈希操作的结果熵更大,但事实这么做确定取得了不错的结果。

常用算法

字符串哈希

MD4、MD5、SHA-1等。
用于数据索引,或结构化支撑,如哈希表。

加密

数据库中密码存放。

信息摘要

防止信息在传输过程中被篡改

几何哈希

一种图像匹配算法。
可参考:基于Harris和几何哈希法的目标匹配
http://www.docin.com/p-737956954.html

布隆过滤器

1、由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个

### 简单散列函数导致哈希碰撞的原因 哈希碰撞的根本原因是散列函数将无限的关键字集合 \( K \) 映射到了有限的地址集 {0, 1, ..., m-1} 上,因此不可避免会出现多个关键字被映射到同一个地址的情况[^1]。即使采用了均匀分布的设原则,由于地址空间的有限性和实际应用中的数据规模差异,冲突仍然难以完全避免。 当散列函数未能充分随机化输入数据时,某些特定模式的数据可能会集中映射到相同的桶中,从而加剧了碰撞的可能性[^2]。此外,如果装载因子过高(即表中已存入的元素数量接近或超过表容量),也会显著增加发生碰撞的概率[^3]。 --- ### 解决哈希碰撞的主要方法 #### 方法一:开放寻址法 开放寻址是一种通过探查技术来寻找下一个可用槽位的方式。常见的探查策略包括线性探查、二次探查以及双重散列等。其中: - **线性探查**:依次查找下一位置直到找到空闲单元为止; - **二次探查**:采用平方数增量进行跳跃式探测; - **双重散列**:利用第二个独立的散列函数算步长以实现更复杂的跳转逻辑。 这种方法的优点在于无需额外存储链表节点指针信息,缺点则是可能导致聚集现象——即新插入项倾向于集中在已有项附近区域形成簇群效应。 #### 方法二:拉链法 (Separate Chaining) 对于每个可能产生的哈希维护一条链接列表,在遇到重复键时只需将其附加至对应索引处即可完成操作。这种方式能够很好地适应动态变化的需求场景,并且理论上支持任意大小的工作负载而不会受到固定数组长度限制的影响。 然而需要注意的是,随着每条链条的增长过长,则检索效率将会退化成顺序扫描级别 O(n),所以在实际部署过程中应当合理控制平均链长维持在一个较低水平之上。 #### 方法三:再散列 (Rehashing) 当当前使用的哈希表达到一定满度之后触发扩容机制重新构建更大尺寸的新结构并迁移旧有数据进去。此过程通常伴随着调整原有的哈希算法参数使得整体布局更加稀疏分散开来降低未来可能出现频繁冲突的风险概率。 另外还有诸如完美哈希生成器之类专门针对静态数据库定制优化的技术手段可供选用视具体情况决定采纳与否[^4]。 --- ```python import hashlib def simple_hash(text): """ 使用 MD5 散列函数 """ md5 = hashlib.md5() md5.update(text.encode('utf-8')) return int(md5.hexdigest(), 16) # 示例演示简单的哈希碰撞可能性 texts = ["hello", "world"] for t in texts: print(f"'{t}' 的哈希为: {simple_hash(t)}") ``` 上述代码片段展示了如何基于 Python 中 `hashlib` 库创建一个简易版字符串到整型数转换工具。尽管这里选取了 MD5 这样较为安全可靠的工业标准级方案作为基础构件之一,但由于目标范围缩小为了单一维度上的纯数字序列表达形式的缘故,依然存在理论意义上的潜在风险隐患需要引起重视加以防范规避措施落实到位才行哦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值