mixin_sdk_rs/
utils.rs

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    // Set UUID version to 3 (MD5 hash based)
14    sum[6] = (sum[6] & 0x0f) | 0x30;
15    // Set UUID variant to RFC 4122
16    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}