4. 哈希算法性能评测:SHA-256、SM3、BLAKE2归纳总结
做加密性能调优的,哈希算法往往是第一个被盯上的瓶颈。我记得有一次给一个日志系统做完整性校验,每秒要算几万条记录的哈希,SHA-256直接把CPU吃掉30%。那之后我就养成了习惯——选哈希前,先跑个基准测试。
这篇我把SHA-256、SM3、BLAKE2掰开揉碎了聊,结合我在几个项目里踩过的坑,希望能帮你选型时少走弯路。
三种算法速览
先简单列一下它们的身世和定位:
| 算法 | 输出长度 | 设计意图 | 软件速度 | 硬件加速 |
|---|---|---|---|---|
| SHA-256 | 256 bit | FIPS标准,通用安全 | 中等 | Intel SHA-NI,ARM SHA |
| SM3 | 256 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/s | 1.0x | 标准实现 |
| SM3 | 约 190 MB/s | 0.86x | 国密实现 |
| BLAKE2b | 约 520 MB/s | 2.36x | libsodium 实现 |
我曾经踩过坑:用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 是最佳选择。如果要在老系统里替换 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+)直接崩盘。真实性最重要。