diff --git a/Cargo.toml b/Cargo.toml index 5d368e18c..04a5ebe8d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,11 +54,11 @@ status = "actively-developed" [badges.travis-ci] repository = "uuid-rs/uuid" -[dependencies.md5] +[dependencies.getrandom] optional = true -version = "0.7" +version = "0.1" -[dependencies.rand] +[dependencies.md5] optional = true version = "0.7" @@ -92,12 +92,12 @@ version = "1.0.56" default = ["std"] guid = ["winapi"] std = [] -stdweb = [ "rand/stdweb" ] +stdweb = ["getrandom"] v1 = [] v3 = ["md5"] -v4 = ["rand"] +v4 = ["getrandom"] v5 = ["sha1"] -wasm-bindgen = ["rand/wasm-bindgen"] +wasm-bindgen = ["getrandom"] [target.'cfg(windows)'.dependencies.winapi] optional = true diff --git a/README.md b/README.md index 5908eb62e..419aa2683 100644 --- a/README.md +++ b/README.md @@ -95,8 +95,8 @@ To create a new random (V4) UUID and print it out in hexadecimal form: use uuid::Uuid; -fn main() { - let my_uuid = Uuid::new_v4(); +fn main() -> Result<(), Box { + let my_uuid = Uuid::new_v4()?; println!("{}", my_uuid); } ``` diff --git a/src/lib.rs b/src/lib.rs index c3d0d225d..ceeba67bf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -93,8 +93,8 @@ //! //! use uuid::Uuid; //! -//! fn main() { -//! let my_uuid = Uuid::new_v4(); +//! fn main() -> Result<(), Box { +//! let my_uuid = Uuid::new_v4()?; //! println!("{}", my_uuid); //! } //! ``` diff --git a/src/v4.rs b/src/v4.rs index fe1af0f63..6c647997b 100644 --- a/src/v4.rs +++ b/src/v4.rs @@ -1,12 +1,11 @@ use crate::prelude::*; -use rand; impl Uuid { /// Creates a random UUID. /// - /// This uses the [`rand`] crate's default task RNG as the source of random - /// numbers. If you'd like to use a custom generator, don't use this - /// method: use the `rand::Rand trait`'s `rand()` method instead. + /// This uses the [`getrandom`] crate to utilise the operating system's RNG + /// as the source of random numbers. If you'd like to use a custom generator, + /// don't use this method: use the `rand::Rand trait`'s `rand()` method instead. /// /// Note that usage of this method requires the `v4` feature of this crate /// to be enabled. @@ -21,19 +20,18 @@ impl Uuid { /// let uuid = Uuid::new_v4(); /// ``` /// + /// [`getrandom`]: https://crates.io/crates/getrandom /// [`rand`]: https://crates.io/crates/rand - pub fn new_v4() -> Self { - use rand::RngCore; + // TODO: change signature to support uuid's Error. + pub fn new_v4() -> Result { + let mut bytes = [0u8; 16]; + getrandom::getrandom(&mut bytes)?; - let mut rng = rand::thread_rng(); - let mut bytes = [0; 16]; - - rng.fill_bytes(&mut bytes); - - Builder::from_bytes(bytes) + let uuid = crate::builder::Builder::from_bytes(bytes) .set_variant(Variant::RFC4122) .set_version(Version::Random) - .build() + .build(); + Ok(uuid) } } @@ -43,7 +41,7 @@ mod tests { #[test] fn test_new() { - let uuid = Uuid::new_v4(); + let uuid = Uuid::new_v4().unwrap(); assert_eq!(uuid.get_version(), Some(Version::Random)); assert_eq!(uuid.get_variant(), Some(Variant::RFC4122)); @@ -51,7 +49,7 @@ mod tests { #[test] fn test_get_version() { - let uuid = Uuid::new_v4(); + let uuid = Uuid::new_v4().unwrap(); assert_eq!(uuid.get_version(), Some(Version::Random)); assert_eq!(uuid.get_version_num(), 4)