4. 哈希算法性能评测:SHA-256、SM3、BLAKE2归纳总结

做加密性能调优的,哈希算法往往是第一个被盯上的瓶颈。我记得有一次给一个日志系统做完整性校验,每秒要算几万条记录的哈希,SHA-256直接把CPU吃掉30%。那之后我就养成了习惯——选哈希前,先跑个基准测试。

这篇我把SHA-256、SM3、BLAKE2掰开揉碎了聊,结合我在几个项目里踩过的坑,希望能帮你选型时少走弯路。

三种算法速览

先简单列一下它们的身世和定位:

算法输出长度设计意图软件速度硬件加速
SHA-256256 bitFIPS标准,通用安全中等Intel SHA-NI,ARM SHA
SM3256 bit中国国密标准中等偏慢部分国产芯片支持
BLAKE2可变(默认256)现代高速,替代MD5/SHA-1极快无专用指令,但可利用SIMD
个人习惯:我一般先看有无硬件加速。有SHA-NI的Intel芯片上,SHA-256不比BLAKE2慢多少;但没加速时,BLAKE2能甩它一截。

实测性能数据

说说怎么测。我常用的命令是 OpenSSL 的 speed 子命令:

# 单核 SHA-256
openssl speed -evp sha256 -elapsed -bytes 8192

# SM3 (OpenSSL 1.1.1+)
openssl speed -evp sm3 -elapsed

# BLAKE2b
openssl speed -evp blake2b512 -elapsed

拿我手边一台 Intel Xeon Gold 5218(无SHA-NI)测出来的典型值(单位MB/s,单线程,8KB块):

算法软件吞吐相对速度备注
SHA-256约 220 MB/s1.0x标准实现
SM3约 190 MB/s0.86x国密实现
BLAKE2b约 520 MB/s2.36xlibsodium 实现
我曾经踩过坑:用OpenSSL 1.1.0测SM3,发现速度只有30 MB/s——因为那时候SM3还是用纯C软实现,根本没过优化。后来升级到1.1.1才正常。所以测试前一定要确认库版本,别冤枉算法。

我踩过的其他坑

  • SHA-256 的硬件加速陷阱:你代码里开了 SHA-NI,但容器里没暴露 CPU 指令集——速度瞬间掉回纯软。务必在运行时检查 /proc/cpuinfo 里的 sha_ni 标志。
  • SM3 的非对称支持:SM3 在证书签名场景里很常用,但 OpenSSL 的 SM3 实现最初只支持 hash,不支持 HMAC-SM3。我当年做接口签名时被坑了整整两天。
  • BLAKE2 的密钥封装:BLAKE2 可以当 MAC 用(BLAKE2s/b 都有 keyed 模式),但很多人只当纯哈希用。其实你完全可以用它替代 HMAC-SHA256,速度快一倍。

选型决策流程

说白了,选哪个看场景。下面这张图是我自己总结的决策树,画出来方便以后复用:

哈希算法选型决策流程 开始选型 国密合规? SM3 速度优先? BLAKE2 兼容性优先? SHA-256 其他(BLAKE3等) 是 否 是 否 是 否

解释一下:如果你的系统必须通过国密合规审查,直接上 SM3,没得选。否则,追求极致性能且没有兼容性包袱,BLAKE2 是最佳选择。如果要在老系统里替换 MD5/SHA-1,且要保证最广泛的库和硬件支持,SHA-256 最稳妥。

一个经验:移动端 App 做数据完整性校验,我强烈推荐 BLAKE2b(512)。它不仅快,而且 libsodium 在各种平台上都能跑,不会出现 OpenSSL 版本不一致的问题。

总结建议

不同场景的直接推荐:

  • 金融、政务、合规场景:SM3,没商量。记得用国密局认证的软件库(如 GmSSL 或 Tongsuo)。
  • 通用服务器、API签名:BLAKE2b 或 BLAKE2s。速度比 SHA-256 快 2~3 倍,安全性足够。
  • 嵌入式和旧系统:SHA-256。因为几乎所有硬件和内核都内置了它的加速驱动。
  • 高性能哈希表:可以考虑 BLAKE3(非本章算法),但如果只能用这三种,BLAKE2 依然完胜。
最后补一句:不管你选哪个,上线前请一定用真实数据长度压一下。我见过有人用 1 字节数据测出天量吞吐,放到生产(4KB+)直接崩盘。真实性最重要。