在Rust中对读者进行哈希的正确方法?

时间:2018-01-31 02:16:28

标签: hash rust

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

为了让它与读者一起工作,我实现了一个包装结构,它实现了Write特征并直接从XxHash::write特征调用了Hash。这样做有更优雅或标准的方法吗?

#[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(())
    }
}

1 个答案:

答案 0 :(得分:2)

这就是我要做的,虽然我也会实现write_all,因为它可以同样简单:

use std::hash::Hasher;
use std::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(())
    }
}

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