1pub fn make_id(domain: &str, data: &[u8]) -> u128 {
11 let mut hasher = blake3::Hasher::new();
12 hasher.update(domain.as_bytes());
13 hasher.update(b":");
14 hasher.update(data);
15 let hash = hasher.finalize();
16 let bytes: &[u8; 16] = hash.as_bytes()[..16].try_into().unwrap_or_else(|_| {
17 unreachable!("BLAKE3 hash is always at least 16 bytes")
19 });
20 u128::from_le_bytes(*bytes)
21}
22
23pub fn id_to_hex(id: u128) -> String {
25 format!("0x{id:032x}")
26}
27
28#[cfg(test)]
29mod tests {
30 use super::*;
31
32 #[test]
33 fn make_id_is_deterministic() {
34 let a = make_id("test", b"hello");
35 let b = make_id("test", b"hello");
36 assert_eq!(a, b);
37 }
38
39 #[test]
40 fn different_domains_produce_different_ids() {
41 let a = make_id("fn", b"main");
42 let b = make_id("bb", b"main");
43 assert_ne!(a, b);
44 }
45
46 #[test]
47 fn id_to_hex_format() {
48 let id = make_id("test", b"hello");
49 let hex = id_to_hex(id);
50 assert!(hex.starts_with("0x"));
51 assert_eq!(hex.len(), 34);
53 }
54}