你为什么还在用 MD5——哈希函数选型实测
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
64 MB 数据,各种哈希算法的吞吐:
先看最尴尬的一行对比:
MD5 既不安全,也不快。 很多人选 MD5 的理由是「它快,我又不需要安全」。但在今天的 CPU 上,MD5 比同样已被攻破的 SHA-1 慢了 38%,比安全的 BLAKE2b 慢 —— 等等,BLAKE2b 是 532 MB/s,MD5 是 619 MB/s,MD5 确实还快一点。但差距只有 16%,而 BLAKE2b 是密码学安全的。 MD5 慢的原因是它的结构天生串行——每一步都依赖上一步的结果,没法用 SIMD 并行化。而 SHA-1 的消息扩展部分有足够的指令级并行度,OpenSSL 用 AVX2 做了深度优化。
如果你需要的是「快」xxHash3 的 7499 MB/s,是 SHA-256 的 18.8 倍。 它不是密码学哈希——给定一个输出,构造碰撞是平凡的。但如果你的用途是:
这些场景不存在「攻击者故意构造碰撞」的威胁模型(或者说,威胁来自别处),那用加密哈希就是纯粹的浪费——你花了 19 倍的 CPU 买了一个你不需要的性质。 如果你需要的是「安全」别用 SHA-256,试试 BLAKE2b。
快 33%,安全性不低于 SHA-3(它是 SHA-3 竞赛决赛算法 BLAKE 的改进版),而且 Python、Go、Rust 的标准库都内置。 顺带解释一下 SHA3-256 为什么最慢(316 MB/s):Keccak 的设计目标是硬件友好和抗侧信道,不是软件吞吐。 它赢得 SHA-3 竞赛靠的是结构上和 SHA-2 完全不同(海绵结构 vs Merkle-Damgård),这样万一 SHA-2 被攻破还有备胎——而不是因为它更快。 除非有合规要求指定 SHA-3,否则 SHA-256 或 BLAKE2b 都是更实际的选择。 短输入时,固定开销占主导哈希表场景下 key 通常很短。16 字节输入的单次调用耗时:
注意这里的比例和大块数据完全不同:xxHash3 对 SHA-256 的优势从 18.8 倍缩到 4.4 倍。 因为短输入时,主要成本不是计算,是创建哈希对象、处理 padding、输出 digest 这些固定开销。在 Python 里还要加上一次方法调用和一次 bytes 对象分配。 所以「算法吞吐」这个指标只在大块数据上有意义。 哈希几百万个短 key 时,要看的是单次调用延迟。 密码哈希:故意慢 5 个数量级
差了 30 万倍,这是设计目标,不是缺陷。 如果你用 密码哈希函数的全部意义就是让每一次尝试都贵得离谱。而且 scrypt 和 Argon2 还额外要求大量内存,这样 GPU 和 ASIC 的并行优势也被抵消掉。 存密码只有三个正确答案:Argon2id、scrypt、bcrypt。 PBKDF2 是合规场景的最低底线(它只耗 CPU 不耗内存,对 GPU 不够友好)。任何裸 SHA / MD5 / 加盐 SHA 都是错的。 一张选型表
最后哈希函数的选型,本质上是在回答一个问题: 你到底在防谁? 防传输时的比特翻转 → CRC32 够了。 而 MD5 的问题在于:它一个都不防,还不快。 阅读原文:点击这里 该文章在 2026/10/13 11:06:33 编辑过 |
关键字查询
相关文章
正在查询... |