Skip to main content

vtcode_config/loader/
fingerprint.rs

1use 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}