ahsah 2.1.0

Incremental hashing contexts for MD5 and SHA-2 with reader helpers and optional SIMD decode paths
Documentation
use std::io::{self, Read};

use crate::{digest::Digest, encoding::DigestBytes};

const READER_BUFFER_SIZE: usize = 8 * 1024;

pub fn update_reader<D: Digest, R: Read + ?Sized>(
    digest: &mut D,
    reader: &mut R,
) -> io::Result<u64> {
    let mut buffer = [0u8; READER_BUFFER_SIZE];
    let mut read_total = 0u64;

    loop {
        let read = reader.read(&mut buffer)?;
        if read == 0 {
            return Ok(read_total);
        }
        digest.update(&buffer[..read]);
        read_total += read as u64;
    }
}

pub fn digest_reader<D, R>(reader: &mut R) -> io::Result<DigestBytes>
where
    D: Digest + Default,
    R: Read + ?Sized,
{
    let mut digest = D::default();
    update_reader(&mut digest, reader)?;
    Ok(digest.finalize())
}