我试图使用 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/