1use sha2::{Digest, Sha256};
2
3pub fn api_key_fingerprint(api_key: &str) -> String {
4 let digest = Sha256::digest(api_key.as_bytes());
5 let mut fingerprint = String::with_capacity(16);
6 for byte in &digest[..8] {
7 use std::fmt::Write as _;
8 let _ = write!(fingerprint, "{byte:02x}");
9 }
10 fingerprint
11}
12
13pub fn short_id(id: &str) -> String {
14 id.chars().take(8).collect()
15}
16
17#[cfg(test)]
18mod tests {
19 use super::*;
20
21 #[test]
22 fn short_id_truncates_long_ids() {
23 assert_eq!(short_id("1234567890"), "12345678");
24 }
25
26 #[test]
27 fn short_id_returns_input_for_short_strings() {
28 assert_eq!(short_id("abc"), "abc");
29 }
30
31 #[test]
32 fn short_id_returns_input_for_exact_length() {
33 assert_eq!(short_id("12345678"), "12345678");
34 }
35
36 #[test]
37 fn short_id_handles_unicode() {
38 let value = "\u{00e9}".repeat(9);
39 let expected = "\u{00e9}".repeat(8);
40 assert_eq!(short_id(&value), expected);
41 }
42
43 #[test]
44 fn api_key_fingerprint_uses_stable_short_sha256() {
45 assert_eq!(api_key_fingerprint("secret-key"), "85dbe15d75ef9308");
46 }
47}