1use uuid::Uuid;
2
3pub fn unique_object_id<T, I>(args: I) -> String
4where
5 I: IntoIterator<Item = T>,
6 T: AsRef<str>,
7{
8 let mut hasher = md5::Context::new();
9 for s in args {
10 hasher.consume(s.as_ref().as_bytes());
11 }
12 let mut sum: [u8; 16] = hasher.compute().into();
13 sum[6] = (sum[6] & 0x0f) | 0x30;
15 sum[8] = (sum[8] & 0x3f) | 0x80;
17 Uuid::from_bytes(sum).to_string()
18}
19
20pub fn unique_conversation_id(user_id: &str, recipient_id: &str) -> String {
21 let (min_id, max_id) = if user_id <= recipient_id {
22 (user_id, recipient_id)
23 } else {
24 (recipient_id, user_id)
25 };
26 let mut hasher = md5::Context::new();
27 hasher.consume(min_id.as_bytes());
28 hasher.consume(max_id.as_bytes());
29 let mut sum: [u8; 16] = hasher.compute().into();
30
31 sum[6] = (sum[6] & 0x0f) | 0x30;
32 sum[8] = (sum[8] & 0x3f) | 0x80;
33 Uuid::from_bytes(sum).to_string()
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39
40 #[test]
41 fn test_unique_object_id() {
42 let id = unique_object_id(["test", "test"]);
43 println!("{}", id);
44
45 let id2 = unique_object_id(["test".to_string(), "test".to_string()]);
46 println!("{}", id2);
47
48 let id3 = unique_object_id(["test".to_string(), "test".to_string()]);
49 println!("{}", id3);
50
51 assert_eq!(id, "05a671c6-6aef-3a12-8cc0-8b76ea6d30bb".to_string());
52 }
53
54 #[test]
55 fn test_unique_conversation_id() {
56 let id = unique_conversation_id("test1", "test2");
57 println!("id: {}", id);
58 assert_eq!(id, "beff3fcb-a56f-3967-bc5d-52b843df365e");
59 }
60}