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
use fasthash::murmur3;
fn get_hash(url: String) -> u32{
    murmur3::hash32(url.as_bytes())
}
fn get_hash_with_seed(url: String, seed: u32) -> u32 {
    murmur3::hash32_with_seed(url.as_bytes(), seed)
}
fn u32_to_62(hash: u32) -> String {
    let dict = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    let mut n = hash;
    let mut chars:Vec<char> = vec![];
    while n > 0 {
        let i = (n % 62) as usize;
        let c = dict.chars().nth(i).unwrap();
        chars.push(c);
        n /= 62;
    }
    chars.reverse();
    chars.into_iter().collect::<String>()
}
pub fn short_url(url: String) -> String {
    let hash = get_hash(url);
    u32_to_62(hash)
}
pub fn short_url_with_seed(url: String, seed: u32) -> String {
    let hash = get_hash_with_seed(url, seed);
    u32_to_62(hash)
}
#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_get_hash(){
        assert_eq!(get_hash("r7n.cc".to_string()), 3567690683);
    }
    #[test]
    fn test_get_hash_with_seed(){
        assert_eq!(get_hash_with_seed("r7n.cc".to_string(), 0), get_hash("r7n.cc".to_string()));
        assert_eq!(get_hash_with_seed("r7n.cc".to_string(), 1), 3437183471);
    }
    #[test]
    fn test_u32_to_62() {
        assert_eq!(u32_to_62(3567690683), "3TrFk7");
        assert_eq!(u32_to_62(3437183471), "3KC4r5");
    }
    #[test]
    fn test_short_url() {
        assert_eq!(short_url("r7n.cc".to_string()), "3TrFk7");
    }
    #[test]
    fn test_short_url_with_seed() {
        assert_eq!(short_url_with_seed("r7n.cc".to_string(), 0), "3TrFk7");
        assert_eq!(short_url_with_seed("r7n.cc".to_string(), 1), "3KC4r5");
    }
}