• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::Uuid;
2 
3 impl Uuid {
4     /// Creates a UUID using a name from a namespace, based on the MD5
5     /// hash.
6     ///
7     /// A number of namespaces are available as constants in this crate:
8     ///
9     /// * [`NAMESPACE_DNS`]
10     /// * [`NAMESPACE_OID`]
11     /// * [`NAMESPACE_URL`]
12     /// * [`NAMESPACE_X500`]
13     ///
14     /// Note that usage of this method requires the `v3` feature of this crate
15     /// to be enabled.
16     ///
17     /// # Examples
18     ///
19     /// Generating a MD5 DNS UUID for `rust-lang.org`:
20     ///
21     /// ```
22     /// # use uuid::{Uuid, Version};
23     /// let uuid = Uuid::new_v3(&Uuid::NAMESPACE_DNS, b"rust-lang.org");
24     ///
25     /// assert_eq!(Some(Version::Md5), uuid.get_version());
26     /// ```
27     ///
28     /// # References
29     ///
30     /// * [UUID Version 3 in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-5.3)
31     /// * [Name-Based UUID Generation in RFC 9562](https://www.ietf.org/rfc/rfc9562.html#section-6.5)
32     ///
33     /// [`NAMESPACE_DNS`]: #associatedconstant.NAMESPACE_DNS
34     /// [`NAMESPACE_OID`]: #associatedconstant.NAMESPACE_OID
35     /// [`NAMESPACE_URL`]: #associatedconstant.NAMESPACE_URL
36     /// [`NAMESPACE_X500`]: #associatedconstant.NAMESPACE_X500
new_v3(namespace: &Uuid, name: &[u8]) -> Uuid37     pub fn new_v3(namespace: &Uuid, name: &[u8]) -> Uuid {
38         crate::Builder::from_md5_bytes(crate::md5::hash(namespace.as_bytes(), name)).into_uuid()
39     }
40 }
41 
42 #[cfg(test)]
43 mod tests {
44     use super::*;
45 
46     #[cfg(all(
47         target_arch = "wasm32",
48         target_vendor = "unknown",
49         target_os = "unknown"
50     ))]
51     use wasm_bindgen_test::*;
52 
53     use crate::{std::string::ToString, Variant, Version};
54 
55     static FIXTURE: &'static [(&'static Uuid, &'static str, &'static str)] = &[
56         (
57             &Uuid::NAMESPACE_DNS,
58             "example.org",
59             "04738bdf-b25a-3829-a801-b21a1d25095b",
60         ),
61         (
62             &Uuid::NAMESPACE_DNS,
63             "rust-lang.org",
64             "c6db027c-615c-3b4d-959e-1a917747ca5a",
65         ),
66         (
67             &Uuid::NAMESPACE_DNS,
68             "42",
69             "5aab6e0c-b7d3-379c-92e3-2bfbb5572511",
70         ),
71         (
72             &Uuid::NAMESPACE_DNS,
73             "lorem ipsum",
74             "4f8772e9-b59c-3cc9-91a9-5c823df27281",
75         ),
76         (
77             &Uuid::NAMESPACE_URL,
78             "example.org",
79             "39682ca1-9168-3da2-a1bb-f4dbcde99bf9",
80         ),
81         (
82             &Uuid::NAMESPACE_URL,
83             "rust-lang.org",
84             "7ed45aaf-e75b-3130-8e33-ee4d9253b19f",
85         ),
86         (
87             &Uuid::NAMESPACE_URL,
88             "42",
89             "08998a0c-fcf4-34a9-b444-f2bfc15731dc",
90         ),
91         (
92             &Uuid::NAMESPACE_URL,
93             "lorem ipsum",
94             "e55ad2e6-fb89-34e8-b012-c5dde3cd67f0",
95         ),
96         (
97             &Uuid::NAMESPACE_OID,
98             "example.org",
99             "f14eec63-2812-3110-ad06-1625e5a4a5b2",
100         ),
101         (
102             &Uuid::NAMESPACE_OID,
103             "rust-lang.org",
104             "6506a0ec-4d79-3e18-8c2b-f2b6b34f2b6d",
105         ),
106         (
107             &Uuid::NAMESPACE_OID,
108             "42",
109             "ce6925a5-2cd7-327b-ab1c-4b375ac044e4",
110         ),
111         (
112             &Uuid::NAMESPACE_OID,
113             "lorem ipsum",
114             "5dd8654f-76ba-3d47-bc2e-4d6d3a78cb09",
115         ),
116         (
117             &Uuid::NAMESPACE_X500,
118             "example.org",
119             "64606f3f-bd63-363e-b946-fca13611b6f7",
120         ),
121         (
122             &Uuid::NAMESPACE_X500,
123             "rust-lang.org",
124             "bcee7a9c-52f1-30c6-a3cc-8c72ba634990",
125         ),
126         (
127             &Uuid::NAMESPACE_X500,
128             "42",
129             "c1073fa2-d4a6-3104-b21d-7a6bdcf39a23",
130         ),
131         (
132             &Uuid::NAMESPACE_X500,
133             "lorem ipsum",
134             "02f09a3f-1624-3b1d-8409-44eff7708208",
135         ),
136     ];
137 
138     #[test]
139     #[cfg_attr(
140         all(
141             target_arch = "wasm32",
142             target_vendor = "unknown",
143             target_os = "unknown"
144         ),
145         wasm_bindgen_test
146     )]
test_new()147     fn test_new() {
148         for &(ref ns, ref name, _) in FIXTURE {
149             let uuid = Uuid::new_v3(*ns, name.as_bytes());
150             assert_eq!(uuid.get_version(), Some(Version::Md5));
151             assert_eq!(uuid.get_variant(), Variant::RFC4122);
152         }
153     }
154 
155     #[test]
156     #[cfg_attr(
157         all(
158             target_arch = "wasm32",
159             target_vendor = "unknown",
160             target_os = "unknown"
161         ),
162         wasm_bindgen_test
163     )]
test_hyphenated_string()164     fn test_hyphenated_string() {
165         for &(ref ns, ref name, ref expected) in FIXTURE {
166             let uuid = Uuid::new_v3(*ns, name.as_bytes());
167             assert_eq!(uuid.hyphenated().to_string(), *expected);
168         }
169     }
170 }
171