1. 主流算法速览
算法 | 输出长度 | 设计目标 | 安全状态 | 典型用途 |
---|---|---|---|---|
MD5 | 128 bit | 快速完整性校验 | ❗已可碰撞攻击 | 文件校验、日志指纹(非安全场景) |
SHA-256 | 256 bit | 加密安全 | ✅ 目前无实用碰撞 | 区块链、签名、密码存储 |
xxHash64 | 64 bit | 极限速度 | ⚠️ 非加密,低碰撞率 | 高吞吐缓存键、BloomFilter |
SHA-3 / Keccak | 224-512 bit | 加密安全 | ✅ 新一代标准 | 数字签名、高安全场景 |
2. 原理差异一句话总结
-
MD5/SHA-2:
把消息补位→分块→多轮循环更新寄存器→输出摘要。差异主要在轮数、寄存器长度和常量。
SHA-256 轮数更多、输出更长,抗碰撞能力显著优于 MD5。 -
xxHash64:
将输入切成 64-bit 块,用乘法-旋转-异或组合快速混合,最后合并结果。
目标是速度而非抗密码学攻击。
3. 会“撞车”吗?
算法 | 理论碰撞概率 | 实际演示 |
---|---|---|
MD5 | 2⁻¹²⁸ → 已被秒级构造 | 2017 年谷歌公布 2 个不同 PDF 同 MD5 |
SHA-256 | 2⁻²⁵⁶ → 当前算力下不可行 | 无公开碰撞实例 |
xxHash64 | 2⁻⁶⁴ → 足够用于非加密场景 | 需 2³² 量级尝试才可能碰撞 |
4. 选型建议
-
需要防篡改 / 合规 → SHA-256(或 SHA-3)。
-
仅做缓存键 / 布隆过滤器 → xxHash64(快 5-10×)。
-
旧系统兼容 → MD5 仍可,但务必加盐并准备迁移。
一句话:安全场景用 SHA-256,性能场景用 xxHash64,MD5 留给历史包袱。
下面按算法 → 核心原理 → 步骤拆解 → 特点/注意点四段式,为你一次性讲透 MD5、SHA-256、xxHash64 三条主流哈希算法的内部机制。
1️⃣ MD5(Message-Digest Algorithm 5)
维度 | 说明 |
---|---|
输出长度 | 128 bit(16 字节,通常表示为 32 个十六进制字符) |
设计目标 | 早期完整性校验,快速生成“指纹” |
安全现状 | ❌ 已可秒级构造碰撞,禁止用于安全场景 |
原理与步骤
-
填充:先把消息补长到 512 bit 的整数倍——先补 1,再补 0,直到长度 ≡ 448 (mod 512),最后附加 64 bit 的原始长度字段。
-
初始化寄存器:4 个 32 bit 链接变量
A, B, C, D
作为初始向量。 -
四轮 64 步运算:
-
每轮 16 步,分别使用非线性函数 F、G、H、I 及循环左移、加法、常数表
T[i]
。 -
每步公式示例:
a = b + ((a + F(b,c,d) + M[k] + T[i]) <<< s)
-
四轮共 64 步完成后,将结果累加到
A~D
,输出 128 bit 摘要。
-
2️⃣ SHA-256(SHA-2 家族)
维度 | 说明 |
---|---|
输出长度 | 256 bit(32 字节,64 个十六进制字符) |
设计目标 | 加密级安全散列,目前无实用碰撞 |
安全现状 | ✅ 仍被 NIST 推荐,区块链/SSL 广泛采用 |
原理与步骤
-
填充:与 MD5 类似,先补位到 512 bit 倍数,再附加 64 bit 长度。
-
初始化 8 个 32 bit 哈希初值(取自前 8 个素数平方根的小数部分)。
-
64 轮主循环:
-
每轮使用 Ch、Maj、Σ0、Σ1 等位运算函数,结合消息调度数组
W[0..63]
。 -
每轮更新 8 个工作变量
a~h
,最终与初始向量相加得到 256 bit 摘要。
-
3️⃣ xxHash64(非加密哈希)
维度 | 说明 |
---|---|
输出长度 | 64 bit(8 字节) |
设计目标 | 极限速度,低碰撞率,不用于加密 |
安全现状 | ⚠️ 仅做完整性校验/哈希表键,不抗攻击 |
原理与步骤
-
初始化:给定 64 bit 种子 + 4 个 64 bit 内部状态变量。
-
分块处理(64 字节/块):
-
对每个块执行 乘法-旋转-异或(
mul + rotl + xor
)组合运算。 -
运算高度流水线化,接近 内存带宽极限。
-
-
合并与雪崩:处理剩余尾巴,再把 4 个状态变量合并、二次混淆,输出 64 bit 摘要。
核心差异速览
特性 | MD5 | SHA-256 | xxHash64 |
---|---|---|---|
输出长度 | 128 bit | 256 bit | 64 bit |
速度 | 快 | 中等 | 极快 |
碰撞安全 | ❌ 已破 | ✅ 安全 | ⚠️ 非加密 |
适用场景 | 旧校验、日志指纹 | 数字签名、区块链 | 缓存键、布隆过滤器 |
一句话总结:MD5 看历史,SHA-256 看安全,xxHash64 看性能。