use core::fmt;
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct Hash32<'a>(pub &'a [u8; 32]);
impl<'a> Hash32<'a> {
#[inline]
pub fn as_bytes(&self) -> &[u8] {
self.0.as_slice()
}
#[inline]
pub fn as_array(&self) -> &[u8; 32] {
self.0
}
#[inline]
pub fn eq_array(&self, other: &[u8; 32]) -> bool {
self.0 == other
}
}
impl fmt::Debug for Hash32<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Hash32(")?;
for b in self.0.iter().rev() {
write!(f, "{b:02x}")?;
}
write!(f, ")")
}
}
impl fmt::Display for Hash32<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for b in self.0.iter().rev() {
write!(f, "{b:02x}")?;
}
Ok(())
}
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct Hash20<'a>(pub &'a [u8; 20]);
impl fmt::Debug for Hash20<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Hash20(")?;
for b in self.0.iter() {
write!(f, "{b:02x}")?;
}
write!(f, ")")
}
}
#[cfg(feature = "std")]
pub fn double_sha256(data: &[u8]) -> [u8; 32] {
use sha2::{Digest, Sha256};
let first = Sha256::digest(data);
Sha256::digest(first).into()
}