1use std::error::Error;
2use std::ops::Range;
3
4
5#[derive(Debug, Eq, PartialEq, Clone)]
7pub struct HashInfo {
8 pub name: &'static str,
10
11 pub hash_len: usize,
13 pub hash_len_r: Range<usize>
15}
16
17
18pub trait Hash {
20 fn info(&self) -> HashInfo;
22
23 fn hash(&self, buf: &mut[u8], data: &[u8]) -> Result<usize, Box<dyn Error + 'static>>;
25}
26
27pub trait VarlenHash: Hash {
29 fn varlen_hash(&self, buf: &mut[u8], data: &[u8]) -> Result<usize, Box<dyn Error + 'static>>;
31}
32
33
34pub trait StreamingHash {
36 fn info(&self) -> HashInfo;
38
39 fn init(&mut self) -> Result<(), Box<dyn Error + 'static>>;
41 fn update(&mut self, input: &[u8]) -> Result<(), Box<dyn Error + 'static>>;
43 fn finish(&mut self, buf: &mut[u8]) -> Result<usize, Box<dyn Error + 'static>>;
45}
46
47pub trait StreamingVarlenHash: StreamingHash {
49 fn varlen_init(&mut self, hash_len: usize) -> Result<(), Box<dyn Error + 'static>>;
51}