You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中sha1 crate计算结果与shasum不一致的原因排查

为什么Rust sha1 crate计算的SHA1和macOS shasum结果不一致?

问题核心原因是**echo命令默认会在输出内容末尾自动添加换行符**,而你的Rust代码是直接对原始字符串计算哈希,没有包含这个额外的换行符。

举个直观的对比:

  • Rust代码计算的是纯字符串"a"的SHA1值
  • 执行echo "a"时,实际输出的内容是"a\n"(字符a加上换行符),shasum计算的是这个带换行的完整内容的哈希

验证差异

使用echo -n参数可以禁止添加换行符,此时shasum的结果会和Rust代码完全匹配:

echo -n "a" | shasum -a 1
# 输出:86f7e437faa5a7fce15d1ddcb9eaeaea377667b8  -

对应你Rust代码中"a"的计算结果,完全一致。

再验证其他字符串:

echo -n "string" | shasum -a 1
# 输出:ecb252044b5ea0f679ee78ec1a12904739e2904d  -

同样和你的Rust输出匹配。

对齐结果的两种方式

  1. 让shasum匹配Rust代码:
    始终使用echo -n来避免添加换行符,直接计算原始字符串的哈希。

  2. 让Rust代码匹配shasum:
    在每个输入字符串后手动添加换行符,模拟echo的默认行为:

    use sha1::{Digest, Sha1};
    
    fn main() {
        for s in vec![
            "a",
            "string",
            "some text",
            "https://example.com",
        ] {
            compute_digest(s);
        }
    }
    
    fn compute_digest(s: &str) {
        let mut hasher = Sha1::new();
        // 添加换行符,模拟echo的默认输出
        hasher.update(format!("{s}\n"));
        let digest = hasher.finalize();
        println!("{s:20} -> {digest:x}");
    }
    

内容的提问来源于stack exchange,提问作者devforfu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:22:46