vtcode_config/loader/
fingerprint.rs1use sha2::{Digest, Sha256};
2use toml::Value as TomlValue;
3
4pub fn fingerprint_toml_value(value: &TomlValue) -> String {
5 let serialized = toml::to_string(value).unwrap_or_else(|_| value.to_string());
6 fingerprint_str(&serialized)
7}
8
9pub fn fingerprint_str(value: &str) -> String {
10 let mut hasher = Sha256::new();
11 hasher.update(value.as_bytes());
12 let digest = hasher.finalize();
13 let mut output = String::with_capacity(digest.len() * 2);
14
15 for byte in digest {
16 output.push(nibble_to_hex(byte >> 4));
17 output.push(nibble_to_hex(byte & 0x0f));
18 }
19
20 output
21}
22
23fn nibble_to_hex(nibble: u8) -> char {
24 match nibble {
25 0..=9 => char::from(b'0' + nibble),
26 10..=15 => char::from(b'a' + (nibble - 10)),
27 _ => unreachable!("nibble must be in 0..=15"),
28 }
29}