【问题标题】:How to hash a binary file in Rust如何在 Rust 中对二进制文件进行哈希处理
【发布时间】:2021-12-15 15:38:48
【问题描述】:

在 rust 中,使用 sha256 = "1.0.2"(或类似的),我如何散列二进制文件(即 tar.gz 存档)?

我正在尝试获取该二进制文件的 sha256。

这不起作用:

fn hash() {
    let file = "file.tar.gz";
    let computed_hash = sha256::digest_file(std::path::Path::new(file)).unwrap();
    computed_hash
}

输出是:

...
Error { kind: InvalidData, message: "stream did not contain valid UTF-8" }

【问题讨论】:

标签: rust sha256


【解决方案1】:

编辑: 升级到sha256 = "1.0.3" 应该可以解决这个问题

问题是digest_file 在内部将文件读取到String,这要求它包含有效的UTF-8,这显然不是您想要的。

相反,您可以将文件读取为字节并将其传递给sha256::digest_bytes

let bytes = std::fs::read(path).unwrap();  // Vec<u8>
let hash = sha256::digest_bytes(&bytes);

【讨论】:

    【解决方案2】:

    所依赖的sha2 crate 支持散列Readable 对象,而无需将整个文件读入内存。请参阅hashes readme 中的示例。

    use sha2::{Sha256, Digest};
    use std::{io, fs};
    
    let mut hasher = Sha256::new();
    let mut file = fs::File::open("file.tar.gz")?;
    
    let bytes_written = io::copy(&mut file, &mut hasher)?;
    let hash_bytes = hasher.finalize();
    

    【讨论】:

    • 最好不要将整个文件读入内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多