use core::fmt::Debug;
pub trait Digest: Clone + Default {
const OUTPUT_SIZE: usize;
type Output: Copy + Eq + Debug + AsRef<[u8]>;
#[must_use]
fn new() -> Self;
fn update(&mut self, data: &[u8]);
#[inline]
fn update_vectored(&mut self, bufs: &[&[u8]]) {
for buf in bufs {
self.update(buf);
}
}
#[cfg(feature = "std")]
#[inline]
fn update_io_slices(&mut self, bufs: &[std::io::IoSlice<'_>]) {
for buf in bufs {
self.update(buf);
}
}
#[must_use]
fn finalize(&self) -> Self::Output;
fn reset(&mut self);
#[inline]
#[must_use]
fn digest(data: &[u8]) -> Self::Output {
let mut h = Self::new();
h.update(data);
h.finalize()
}
#[inline]
#[must_use]
fn digest_vectored(bufs: &[&[u8]]) -> Self::Output {
let mut h = Self::new();
h.update_vectored(bufs);
h.finalize()
}
#[cfg(feature = "std")]
#[inline]
#[must_use]
fn digest_io_slices(bufs: &[std::io::IoSlice<'_>]) -> Self::Output {
let mut h = Self::new();
h.update_io_slices(bufs);
h.finalize()
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[inline]
#[must_use]
fn finalize_to_vec(&self) -> alloc::vec::Vec<u8> {
self.finalize().as_ref().to_vec()
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
#[inline]
#[must_use]
fn digest_to_vec(data: &[u8]) -> alloc::vec::Vec<u8> {
Self::digest(data).as_ref().to_vec()
}
#[cfg(feature = "std")]
#[inline]
#[must_use]
fn reader<R>(inner: R) -> crate::traits::io::DigestReader<R, Self>
where
Self: Sized,
{
crate::traits::io::DigestReader::new(inner)
}
#[cfg(feature = "std")]
#[inline]
#[must_use]
fn writer<W>(inner: W) -> crate::traits::io::DigestWriter<W, Self>
where
Self: Sized,
{
crate::traits::io::DigestWriter::new(inner)
}
}