river-data-core 0.1.1

Common types & traits for the in the river-data platform
Documentation
use sha2::{Digest, Sha256};

#[must_use]
pub fn hash_token(raw_token: &str) -> String {
    let mut hasher = Sha256::new();
    hasher.update(raw_token.as_bytes());
    format!("{:x}", hasher.finalize())
}

#[must_use]
pub fn generate_token() -> String {
    use rand::Rng;
    let bytes: [u8; 32] = rand::rng().random();
    bytes.iter().map(|b| format!("{b:02x}")).collect()
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn hash_is_deterministic() {
        let a = hash_token("test-token");
        let b = hash_token("test-token");
        assert_eq!(a, b);
        assert_eq!(a.len(), 64);
    }

    #[test]
    fn generate_is_unique() {
        let a = generate_token();
        let b = generate_token();
        assert_ne!(a, b);
        assert_eq!(a.len(), 64);
    }
}