1 use crate::Uuid;
2 
3 impl Uuid {
4     /// Creates a UUID using a name from a namespace, based on the SHA-1 hash.
5     ///
6     /// A number of namespaces are available as constants in this crate:
7     ///
8     /// * [`NAMESPACE_DNS`]
9     /// * [`NAMESPACE_OID`]
10     /// * [`NAMESPACE_URL`]
11     /// * [`NAMESPACE_X500`]
12     ///
13     /// Note that usage of this method requires the `v5` feature of this crate
14     /// to be enabled.
15     ///
16     /// # Examples
17     ///
18     /// Generating a SHA1 DNS UUID for `rust-lang.org`:
19     ///
20     /// ```
21     /// # use uuid::{Uuid, Version};
22     /// let uuid = Uuid::new_v5(&Uuid::NAMESPACE_DNS, b"rust-lang.org");
23     ///
24     /// assert_eq!(Some(Version::Sha1), uuid.get_version());
25     /// ```
26     ///
27     /// # References
28     ///
29     /// * [Version 3 and 5 UUIDs in RFC4122](https://www.rfc-editor.org/rfc/rfc4122#section-4.3)
30     ///
31     /// [`NAMESPACE_DNS`]: struct.Uuid.html#associatedconst.NAMESPACE_DNS
32     /// [`NAMESPACE_OID`]: struct.Uuid.html#associatedconst.NAMESPACE_OID
33     /// [`NAMESPACE_URL`]: struct.Uuid.html#associatedconst.NAMESPACE_URL
34     /// [`NAMESPACE_X500`]: struct.Uuid.html#associatedconst.NAMESPACE_X500
new_v5(namespace: &Uuid, name: &[u8]) -> Uuid35     pub fn new_v5(namespace: &Uuid, name: &[u8]) -> Uuid {
36         crate::Builder::from_sha1_bytes(crate::sha1::hash(namespace.as_bytes(), name)).into_uuid()
37     }
38 }
39 
40 #[cfg(test)]
41 mod tests {
42     use super::*;
43 
44     #[cfg(all(
45         target_arch = "wasm32",
46         target_vendor = "unknown",
47         target_os = "unknown"
48     ))]
49     use wasm_bindgen_test::*;
50 
51     use crate::{std::string::ToString, Variant, Version};
52 
53     static FIXTURE: &'static [(&'static Uuid, &'static str, &'static str)] = &[
54         (
55             &Uuid::NAMESPACE_DNS,
56             "example.org",
57             "aad03681-8b63-5304-89e0-8ca8f49461b5",
58         ),
59         (
60             &Uuid::NAMESPACE_DNS,
61             "rust-lang.org",
62             "c66bbb60-d62e-5f17-a399-3a0bd237c503",
63         ),
64         (
65             &Uuid::NAMESPACE_DNS,
66             "42",
67             "7c411b5e-9d3f-50b5-9c28-62096e41c4ed",
68         ),
69         (
70             &Uuid::NAMESPACE_DNS,
71             "lorem ipsum",
72             "97886a05-8a68-5743-ad55-56ab2d61cf7b",
73         ),
74         (
75             &Uuid::NAMESPACE_URL,
76             "example.org",
77             "54a35416-963c-5dd6-a1e2-5ab7bb5bafc7",
78         ),
79         (
80             &Uuid::NAMESPACE_URL,
81             "rust-lang.org",
82             "c48d927f-4122-5413-968c-598b1780e749",
83         ),
84         (
85             &Uuid::NAMESPACE_URL,
86             "42",
87             "5c2b23de-4bad-58ee-a4b3-f22f3b9cfd7d",
88         ),
89         (
90             &Uuid::NAMESPACE_URL,
91             "lorem ipsum",
92             "15c67689-4b85-5253-86b4-49fbb138569f",
93         ),
94         (
95             &Uuid::NAMESPACE_OID,
96             "example.org",
97             "34784df9-b065-5094-92c7-00bb3da97a30",
98         ),
99         (
100             &Uuid::NAMESPACE_OID,
101             "rust-lang.org",
102             "8ef61ecb-977a-5844-ab0f-c25ef9b8d5d6",
103         ),
104         (
105             &Uuid::NAMESPACE_OID,
106             "42",
107             "ba293c61-ad33-57b9-9671-f3319f57d789",
108         ),
109         (
110             &Uuid::NAMESPACE_OID,
111             "lorem ipsum",
112             "6485290d-f79e-5380-9e64-cb4312c7b4a6",
113         ),
114         (
115             &Uuid::NAMESPACE_X500,
116             "example.org",
117             "e3635e86-f82b-5bbc-a54a-da97923e5c76",
118         ),
119         (
120             &Uuid::NAMESPACE_X500,
121             "rust-lang.org",
122             "26c9c3e9-49b7-56da-8b9f-a0fb916a71a3",
123         ),
124         (
125             &Uuid::NAMESPACE_X500,
126             "42",
127             "e4b88014-47c6-5fe0-a195-13710e5f6e27",
128         ),
129         (
130             &Uuid::NAMESPACE_X500,
131             "lorem ipsum",
132             "b11f79a5-1e6d-57ce-a4b5-ba8531ea03d0",
133         ),
134     ];
135 
136     #[test]
137     #[cfg_attr(
138         all(
139             target_arch = "wasm32",
140             target_vendor = "unknown",
141             target_os = "unknown"
142         ),
143         wasm_bindgen_test
144     )]
test_get_version()145     fn test_get_version() {
146         let uuid = Uuid::new_v5(&Uuid::NAMESPACE_DNS, "rust-lang.org".as_bytes());
147 
148         assert_eq!(uuid.get_version(), Some(Version::Sha1));
149         assert_eq!(uuid.get_version_num(), 5);
150     }
151 
152     #[test]
153     #[cfg_attr(
154         all(
155             target_arch = "wasm32",
156             target_vendor = "unknown",
157             target_os = "unknown"
158         ),
159         wasm_bindgen_test
160     )]
test_hyphenated()161     fn test_hyphenated() {
162         for &(ref ns, ref name, ref expected) in FIXTURE {
163             let uuid = Uuid::new_v5(*ns, name.as_bytes());
164 
165             assert_eq!(uuid.hyphenated().to_string(), *expected)
166         }
167     }
168 
169     #[test]
170     #[cfg_attr(
171         all(
172             target_arch = "wasm32",
173             target_vendor = "unknown",
174             target_os = "unknown"
175         ),
176         wasm_bindgen_test
177     )]
test_new()178     fn test_new() {
179         for &(ref ns, ref name, ref u) in FIXTURE {
180             let uuid = Uuid::new_v5(*ns, name.as_bytes());
181 
182             assert_eq!(uuid.get_version(), Some(Version::Sha1));
183             assert_eq!(uuid.get_variant(), Variant::RFC4122);
184             assert_eq!(Ok(uuid), u.parse());
185         }
186     }
187 }
188