shorturl_core/
lib.rs

1use fasthash::murmur3;
2fn get_hash(url: String) -> u32{
3    murmur3::hash32(url.as_bytes())
4}
5fn get_hash_with_seed(url: String, seed: u32) -> u32 {
6    murmur3::hash32_with_seed(url.as_bytes(), seed)
7}
8fn u32_to_62(hash: u32) -> String {
9    let dict = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
10    let mut n = hash;
11    let mut chars:Vec<char> = vec![];
12    while n > 0 {
13        let i = (n % 62) as usize;
14        let c = dict.chars().nth(i).unwrap();
15        chars.push(c);
16        n /= 62;
17    }
18    chars.reverse();
19    chars.into_iter().collect::<String>()
20}
21pub fn short_url(url: String) -> String {
22    let hash = get_hash(url);
23    u32_to_62(hash)
24}
25pub fn short_url_with_seed(url: String, seed: u32) -> String {
26    let hash = get_hash_with_seed(url, seed);
27    u32_to_62(hash)
28}
29#[cfg(test)]
30mod tests {
31    use super::*;
32    #[test]
33    fn test_get_hash(){
34        assert_eq!(get_hash("r7n.cc".to_string()), 3567690683);
35    }
36    #[test]
37    fn test_get_hash_with_seed(){
38        assert_eq!(get_hash_with_seed("r7n.cc".to_string(), 0), get_hash("r7n.cc".to_string()));
39        assert_eq!(get_hash_with_seed("r7n.cc".to_string(), 1), 3437183471);
40    }
41    #[test]
42    fn test_u32_to_62() {
43        assert_eq!(u32_to_62(3567690683), "3TrFk7");
44        assert_eq!(u32_to_62(3437183471), "3KC4r5");
45    }
46    #[test]
47    fn test_short_url() {
48        assert_eq!(short_url("r7n.cc".to_string()), "3TrFk7");
49    }
50    #[test]
51    fn test_short_url_with_seed() {
52        assert_eq!(short_url_with_seed("r7n.cc".to_string(), 0), "3TrFk7");
53        assert_eq!(short_url_with_seed("r7n.cc".to_string(), 1), "3KC4r5");
54    }
55}