use blake2_rfc::blake2b::Blake2b; use std::io::{self, Read}; /// Abstraction over a reader which hashes the data being read. pub struct HashReader { reader: R, hasher: Blake2b, } impl HashReader { /// Construct a new `HashReader` given an existing `reader` by value. pub fn new(reader: R) -> Self { HashReader { reader: reader, hasher: Blake2b::new(64), } } /// Destroy this reader and return the hash of what was read. pub fn into_hash(self) -> String { let hash = self.hasher.finalize(); let mut s = String::new(); for c in hash.as_bytes().iter() { s += &format!("{:02x}", c); } s } } impl Read for HashReader { fn read(&mut self, buf: &mut [u8]) -> io::Result { let bytes = self.reader.read(buf)?; if bytes > 0 { self.hasher.update(&buf[0..bytes]); } Ok(bytes) } }