pub fn digest(parts: &[&[u8]]) -> String
Each part is length-prefixed, so moving bytes between parts changes the digest.