pub trait HashAlgorithm: Sized {
const BLOCK_SIZE: usize;
const HASH_SIZE: usize;
const LENGTH_SIZE: usize;
const LENGTH_IS_BIG_ENDIAN: bool;
fn new() -> Self;
fn data_mut(&mut self) -> &mut Vec<u8>;
fn data(&self) -> &[u8];
fn bytes_len(&self) -> usize;
fn set_bytes_len(&mut self, len: usize);
fn process_block(&mut self, block: &[u8]);
fn encode_length(buf: &mut Vec<u8>, total_bits: u128);
fn hash_string(&self) -> String;
fn append_padding(buf: &mut Vec<u8>, total_bits: usize) {
buf.push(0x80);
let current_len = buf.len();
let k = (Self::BLOCK_SIZE - ((current_len + Self::LENGTH_SIZE) % Self::BLOCK_SIZE))
% Self::BLOCK_SIZE;
buf.resize(current_len + k, 0);
Self::encode_length(buf, total_bits as u128);
}
}