更快的 SHA-1 碰撞检测:git 打包校验提速一倍
来源:sam.dev — 46 分 · by srijs
📋 概述
作者在为 git 服务器后端做性能优化时发现,校验客户端上传的 pack 文件是热点:在他的 M4 上校验 git/git 的裸克隆(421,292 个对象、压缩 305MiB、解压后 7.7GiB)要 12.5 秒,其中 84% 花在 SHA-1 上。麻烦在于客户端输入不可信,而 SHA-1 已被证明存在实用的选择前缀碰撞,所以必须使用带碰撞检测的版本:检测版约 900MiB/s,而带硬件指令的普通 SHA-1 能跑 3GB/s。他的新库 sha1dc 有两招:一是把消息扩展表溢出到缓冲区、快路径走硬件、只在可疑块上回退标量重算;二是用一个求解器把约 150 项位级碰撞过滤测试塞进 SIMD 通道。结果是 sha1dc 能跑到普通 SHA-1 速度的 68–81%,而旧库只有 28–29%,pack 校验全核从 2.33 秒降到 1.09 秒。
🔑 核心要点
- 性能真相是惊人的:单线程 pack 校验 12.55 秒里有 84% 花在 SHA-1。
- 为什么不能用快的哈希:SHA-1 存在实用的选择前缀碰撞,而 pack 是客户端上传的不可信输入。
- 速度差距是量级性的:检测版约 900MiB/s,硬件加速的普通 SHA-1 达 3GB/s。
- 第一招是分层:消息扩展表溢出到缓冲区,快路径走硬件,可疑块才标量重算,两架构吞吐约翻倍。
- 第二招是用求解器把约 150 项位级过滤测试塞进 SIMD 通道。
- 实测收益:sha1dc 达普通 SHA-1 的 68–81%(旧库 28–29%),pack 校验全核 2.33 秒降到 1.09 秒、约 2.13 倍。
💡 金句
pack 校验的性能剖析里最大的一块仍然是 SHA-1,所以这段旅程远没有结束。
👍 0
👎 0
← 返回 Hacker News 首页