1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use std::hash::Hasher;

pub fn resolve_refresh_reference<T: AsRef<[u8]>, E: Hasher + Default>(payload: T) -> u64 {
    let mut engine = E::default();
    for i in [0u8, 1u8].iter() {
        engine.write_u8(*i);
    };

    for i in payload.as_ref() {
        engine.write_u8(*i);
    };
    engine.finish()
}

pub fn resolve_authentication_reference<T: AsRef<[u8]>, E: Hasher + Default>(payload: T) -> u64 {
    let mut engine = E::default();
    for i in [1u8, 0u8].iter() {
        engine.write_u8(*i);
    };
    for i in payload.as_ref() {
        engine.write_u8(*i);
    };
    engine.finish()
}

pub fn digest<T: AsRef<[u8]>, E: Hasher + Default>(payload: T) -> u64 {
    let mut engine = E::default();
    for i in payload.as_ref() {
        engine.write_u8(*i);
    };
    engine.finish()
}
#[cfg(test)]
mod tests {
    use super::*;
    use std::collections::hash_map::DefaultHasher;

    #[test]
    fn test_resolve_refresh_reference() {
        let run1 = resolve_refresh_reference::<_, DefaultHasher>("data");
        let run2 = resolve_refresh_reference::<_, DefaultHasher>("data");
        let run3 = resolve_refresh_reference::<_, DefaultHasher>("data");
        assert_eq!(run1, run2);
        assert_eq!(run1, run3);
    }

    #[test]
    fn test_resolve_authentication_reference() {
        let run1 = resolve_authentication_reference::<_, DefaultHasher>("data");
        let run2 = resolve_authentication_reference::<_, DefaultHasher>("data");
        let run3 = resolve_authentication_reference::<_, DefaultHasher>("data");
        assert_eq!(run1, run2);
        assert_eq!(run1, run3);
    }

    #[test]
    fn test_digest() {
        let run1 = digest::<_, DefaultHasher>("data");
        let run2 = digest::<_, DefaultHasher>("data");
        let run3 = digest::<_, DefaultHasher>("data");
        assert_eq!(run1, run2);
        assert_eq!(run1, run3);
    }
}