use sha2::{Digest, Sha256};
pub fn sha256_hex(bytes: &[u8]) -> String {
let mut h = Sha256::new();
h.update(bytes);
h.finalize().iter().map(|b| format!("{b:02x}")).collect()
}
pub fn short(hex: &str) -> &str {
&hex[..hex.len().min(12)]
}
pub struct SetHasher {
inner: Sha256,
}
impl SetHasher {
pub fn new() -> Self { Self { inner: Sha256::new() } }
pub fn add(&mut self, path: &str, content: &[u8]) {
self.inner.update(path.as_bytes());
self.inner.update([0u8]);
self.inner.update((content.len() as u64).to_le_bytes());
self.inner.update(content);
self.inner.update([0u8]);
}
pub fn finish(self) -> String {
self.inner.finalize().iter().map(|b| format!("{b:02x}")).collect()
}
}
impl Default for SetHasher {
fn default() -> Self { Self::new() }
}