Hash算法全景解析:从基础概念到碰撞应对

·

3分钟带你读懂 哈希散列值哈希表消息摘要 的核心逻辑,并掌握 4 种主流Hash碰撞解决策略。

1️⃣ 什么是 Hash算法?

Hash算法(又称散列算法)把任意长度输入通过散列函数变换成固定长度输出,这个输出就叫散列值哈希值


2️⃣ Hash算法的两大主战场

2.1 数据结构:哈希表

哈希表(散列表)利用Hash算法把「关键字」映射到表中某一位置,实现O(1)平均时间复杂度的查找。

👉 一张图帮你把哈希表、链表、数组的查询效率秒懂

2.2 密码学:消息摘要与抗碰撞

在密码学领域,Hash算法被用作消息摘要,确保信息完整性。


3️⃣ 哈希碰撞:为何会发生?如何判断?

不同输入经过相同散列函数后得到同一哈希值,即为哈希碰撞


4️⃣ 4 种常见哈希碰撞解决策略

4.1 开放地址法

一旦冲突,就在哈希表里继续找下一个“空位”。

公式表示:
Hi = (H(key) + d_i) MOD m

优点:无需额外空间。
缺点:容易产生“堆积”,导致连续占用。

4.2 再哈希法(双哈希法)

准备多个互不相同的散列函数 H₁、H₂、H₃…
冲突时顺次切换函数,直至无冲突。
优点:缓解聚集;缺点:计算量增加。

👉 想知道再哈希法让 HashMap 不“堵车”的幕后原理?

4.3 链地址法(Java HashMap 的实现)

把落在同一哈希桶的元素用单向链表串起来,碰撞自动变成链表操作。
优点:

4.4 建立公共溢出区

为主哈希表和溢出区分别建数组:


FAQ · 高频问答

Q1:SHA-256 真的比 MD5 安全吗?为什么?
A1:安全体现在抗碰撞能力。MD5 的 128 位输出已可利用「生日攻击」在 2^64 量级内找到碰撞,而 SHA-256 提供 256 位输出,计算成本指数级提升,抗碰撞性远超 MD5。

Q2:哈希表在高峰期出现“拥挤”,如何优雅扩容?
A2:业界常采用 扩大桶数 + 再哈希 并重写所有键值映射。主流语言或框架内置「负载因子」门限(如 0.75),超出触发自动 resize,通常一次扩容成本被摊销到 O(1)。

Q3:链地址法的链表可以换成红黑树吗?
A3:可以。当链表长度 > 阈值(Java 8 中为 8 且桶数 ≥ 64)时,自动转成红黑树,实现 O(log n) 的最坏查询复杂度,防止恶意哈希攻击。

Q4:为什么区块链交易必须引用交易哈希而非原文?
A4:利用消息摘要的小体积、唯一性优势,既保证完整性又节省区块链存储。

Q5:自己想动手写哈希函数要注意什么?
A5:若用于数据结构,重点确保 均匀分布;若用于密码学场景,务必采用经过验证的算法,拒绝“自创加密”。


5️⃣ 结语:安全与性能永远在做平衡

Hash算法的发展史,就是安全、性能、成本三者之间的反复博弈。
无论你是优化哈希表缓存,还是设计区块链共识,都需基于场景选算法、定长度、备碰撞方案。牢记:用好成熟的哈希函数,远比自己“拍脑袋”DIY 可靠。