use std::io;
use std::path::Path;
use sha2::{Digest, Sha256};
#[must_use]
pub fn sha256_hex(data: &[u8]) -> String {
let mut hasher = Sha256::new();
hasher.update(data);
base16ct::lower::encode_string(&hasher.finalize())
}
#[must_use]
pub fn compute_fingerprint(data: &[u8]) -> String {
format!("sha256:{}", sha256_hex(data))
}
pub fn compute_file_fingerprint(path: &Path) -> io::Result<String> {
let data = std::fs::read(path)?;
Ok(compute_fingerprint(&data))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fingerprint_of_known_bytes() {
let fp = compute_fingerprint(b"hello world");
assert_eq!(
fp,
"sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"
);
}
}