river_data_core/
crypto.rs1use sha2::{Digest, Sha256};
2
3#[must_use]
4pub fn hash_token(raw_token: &str) -> String {
5 let mut hasher = Sha256::new();
6 hasher.update(raw_token.as_bytes());
7 format!("{:x}", hasher.finalize())
8}
9
10#[must_use]
11pub fn generate_token() -> String {
12 use rand::Rng;
13 let bytes: [u8; 32] = rand::rng().random();
14 bytes.iter().map(|b| format!("{b:02x}")).collect()
15}
16
17#[cfg(test)]
18mod tests {
19 use super::*;
20
21 #[test]
22 fn hash_is_deterministic() {
23 let a = hash_token("test-token");
24 let b = hash_token("test-token");
25 assert_eq!(a, b);
26 assert_eq!(a.len(), 64);
27 }
28
29 #[test]
30 fn generate_is_unique() {
31 let a = generate_token();
32 let b = generate_token();
33 assert_ne!(a, b);
34 assert_eq!(a.len(), 64);
35 }
36}