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输出匹配。
对齐结果的两种方式
让shasum匹配Rust代码:
始终使用echo -n来避免添加换行符,直接计算原始字符串的哈希。让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
相关产品推荐
相关产品推荐

