1use ring::digest::{Context, SHA256};
2
3use sofie_core::encoding::base64::{self, URL_SAFE};
4
5#[must_use]
7pub fn digest(parts: &[&[u8]]) -> String {
8 let mut context = Context::new(&SHA256);
9 for part in parts {
10 context.update(&(part.len() as u64).to_be_bytes());
11 context.update(part);
12 }
13 base64::encode(&URL_SAFE, context.finish().as_ref())
14}
15
16#[cfg(test)]
17mod tests {
18 use super::digest;
19
20 #[test]
21 fn the_digest_tells_parts_apart_and_is_stable() {
22 assert_eq!(digest(&[b"ab", b"c"]), digest(&[b"ab", b"c"]));
23 assert_ne!(digest(&[b"ab", b"c"]), digest(&[b"a", b"bc"]));
24 assert_eq!(digest(&[b""]).len(), 43);
25 }
26}