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"); } }