我正在通过
sha1
板条箱计算 Rust 中的 SHA1 摘要,并将这些值用作更大实用程序的一部分。
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();
hasher.update(s);
let digest = hasher.finalize();
println!("{s:20} -> {digest:x}");
}
输出:
a -> 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
string -> ecb252044b5ea0f679ee78ec1a12904739e2904d
some text -> 37aa63c77398d954473262e1a0057c1e632eda77
https://example.com -> 327c3fda87ce286848a574982ddd0b7c7487f816
我创建了一个测试,将实际计算的键与预期值进行比较。使用
shasum
实用程序 (macOS) 计算的预期值如下。但输出与板条箱的结果不同。
echo "a" | shasum -a 1
# 3f786850e387550fdab836ed7e6dc881de23001b
echo "string" | shasum -a 1
# edbf08a562d55ca08be8d118430892695f28d432
echo "some text" | shasum -a 1
# a5c341bec5c89ed16758435069e3124b3685ad93
echo "https://example.com" | shasum -a 1
# 104f444c99548d6fcc870aeddf94096b790ff56e
这是为什么呢?我猜默认
Sha1::new()
实例和 shasum
的功能存在一些差异,但我无法理解它是什么。
原因是
echo
总是在输出中附加换行符。因此,您获得的 echo "a"
输出包含两个字节 0x61 和 0x0a,而 Rust 中的 a
哈希值仅计算字节 0x61。
如果您想在命令行验证这些,请使用
printf
代替。请注意,第一个参数包含格式字符串(就像 printf(3)
一样),因此如果您想包含百分号,则需要将其加倍或写入 printf '%s' "$ARGUMENT"
。
这样做可以使这项工作正常进行:
$ printf 'a' | shasum -a 1
86f7e437faa5a7fce15d1ddcb9eaeaea377667b8 -
$ printf 'a\n' | shasum -a 1
3f786850e387550fdab836ed7e6dc881de23001b -
但请注意,SHA-1 不安全,不应在任何新软件中使用。如果您需要加密哈希函数,请改用 SHA-256(或任何 SHA-2、SHA-3 或 BLAKE2 哈希值)。