hash - 在 Rust 中散列读取器的正确方法?

标签 hash rust

我试图使用 twox-hash为文件生成哈希,因为它似乎是最快的哈希实现,而且安全性不是该实现的关注点。

为了让它与阅读器一起工作,我实现了一个包装器结构,它实现了 Write 特性并直接从 Hash< 调用 XxHash::write/ 特征。有没有更优雅或更标准的方法来做到这一点?

#[derive(Deref)]
struct HashWriter<T: Hasher>(T);

impl<T: Hasher> std::io::Write for HashWriter<T> {
    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
        self.0.write(buf);
        Ok(buf.len())
    }

    fn flush(&mut self) -> std::io::Result<()> {
        Ok(())
    }
}

最佳答案

这就是我要做的,尽管我也会实现 write_all 因为它同样简单:

use std::{hash::Hasher, io};

struct HashWriter<T: Hasher>(T);

impl<T: Hasher> io::Write for HashWriter<T> {
    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
        self.0.write(buf);
        Ok(buf.len())
    }

    fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
        self.write(buf).map(|_| ())
    }

    fn flush(&mut self) -> io::Result<()> {
        Ok(())
    }
}

然后您可以像这样使用它:

use std::fs::File;
use twox_hash::XxHash64;

fn main() {
    let mut f = File::open("/etc/hosts").expect("Unable to open file");

    let hasher = XxHash64::with_seed(0);
    let mut hw = HashWriter(hasher);

    io::copy(&mut f, &mut hw).expect("Unable to copy data");

    let hasher = hw.0;
    println!("{}", hasher.finish());
}

免责声明:我是 twox-hash 的作者/搬运工。

关于hash - 在 Rust 中散列读取器的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48533445/

相关文章:

encryption - 访问实现加密和解密的应用程序是否会更容易被破解?

c - 哈希算法的实现将字符串转换为数字

winapi - 使用winapi从scancode获取char的问题

reference - 有没有办法返回对函数中创建的变量的引用?

rust - 为什么 secp256k1 未压缩的公钥未按预期格式化?

ruby-on-rails - 遍历以创建哈希的哈希

ruby-on-rails - Rails 将哈希数组映射到单个哈希

security - 客户端密码哈希与纯文本

rust - 为什么 Rust 需要知道模块中的代码属于谁?

rust - 如何在返回 Result<() , Error> 的函数中从 Serde 返回错误