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}