use std::sync::Arc;
use libmhash::{paranoid_hash::Hasher, prelude::*, Result};
struct MyHasher {
state: u8,
}
impl Hasher for MyHasher {
fn update(&mut self, data: &[u8]) -> Result<()> {
for d in data {
self.state ^= *d
}
Ok(())
}
fn update_last(&mut self, data: &[u8]) -> Result<()> {
self.update(data)
}
fn digest(&self) -> Result<&[u8]> {
Ok(std::slice::from_ref(&self.state))
}
fn reset(&mut self) {
self.state = 0;
}
fn block_size(&self) -> usize {
1
}
fn digest_size(&self) -> usize {
1
}
}
fn main() {
let mut server = Builder::new()
.on_result(Some(|r: &HasherResult<Arc<&str>>| println!("{:#?}", r)))
.build()
.unwrap();
let sender = server.data_sender();
std::thread::spawn(move || {
for entry in std::fs::read_dir(".").unwrap() {
let dir = entry.unwrap();
if dir.path().is_file() {
let mut hashers = vec![];
hashers.push(HasherWrapper::new(
Arc::new("My Hasher"),
MyHasher { state: 0 },
));
sender.push_file(dir.path(), hashers);
}
}
sender.end();
});
server.compute();
}