Signed-off-by: Magnus Therning <[email protected]>

 uuid/uuid.ml  |  39 ++++++++++++++++++++++++++++++++-------
 uuid/uuid.mli |   3 +++
 2 files changed, 35 insertions(+), 7 deletions(-)


# HG changeset patch
# User Magnus Therning <[email protected]>
# Date 1283529435 -3600
# Node ID f11174c80076be4e3351c63466ae6d1aaf5a367a
# Parent  a6aa72c10a1ab1e1f9a41cde012945d3a1a39d00
Add functions to get UUIDs of different qualities.

Signed-off-by: Magnus Therning <[email protected]>

diff -r a6aa72c10a1a -r f11174c80076 uuid/uuid.ml
--- a/uuid/uuid.ml	Fri Sep 03 16:57:08 2010 +0100
+++ b/uuid/uuid.ml	Fri Sep 03 16:57:15 2010 +0100
@@ -30,12 +30,34 @@
 
 let cookie_of_string s = s
 
-(* FIXME: using /dev/random is too slow but using /dev/urandom is too
-    deterministic. *)
-let dev_random = "/dev/urandom"
+let dev_random = "/dev/random"
+let dev_urandom = "/dev/urandom"
 
-let read_random n = 
-  let ic = open_in_bin dev_random in
+let rnd_array n =
+	let fstbyte i = 0xff land i in
+	let sndbyte i = fstbyte (i lsr 8) in
+	let thdbyte i = sndbyte (i lsr 8) in
+	let rec rnd_list n acc = match n with
+		| 0 -> acc
+		| 1 ->
+			let b = fstbyte (Random.bits ()) in
+			b :: acc
+		| 2 ->
+			let r = Random.bits () in
+			let b1 = fstbyte r in
+			let b2 = sndbyte r in
+			b1 :: b2 :: acc
+		| n -> 
+			let r = Random.bits () in
+			let b1 = fstbyte r in
+			let b2 = sndbyte r in
+			let b3 = thdbyte r in
+			rnd_list (n - 3) (b1 :: b2 :: b3 :: acc)
+	in
+	Array.of_list (rnd_list n [])
+
+let read_array dev n = 
+  let ic = open_in_bin dev in
   try
     let result = Array.init n (fun _ -> input_byte ic) in
     close_in ic;
@@ -50,10 +72,13 @@
     uuid.(6) uuid.(7) uuid.(8) uuid.(9) uuid.(10) uuid.(11)
     uuid.(12) uuid.(13) uuid.(14) uuid.(15)
 
-let make_uuid() = uuid_of_int_array (read_random 16)
+let make_uuid_prng () = uuid_of_int_array (rnd_array 16)
+let make_uuid_urnd () = uuid_of_int_array (read_array dev_urandom 16)
+let make_uuid_rnd () = uuid_of_int_array (read_array dev_random 16)
+let make_uuid = make_uuid_urnd
 
 let make_cookie() =
-  let bytes = Array.to_list (read_random 64) in
+  let bytes = Array.to_list (read_array dev_urandom 64) in
   String.concat "" (List.map (Printf.sprintf "%1x") bytes)
 
 let int_array_of_uuid s =
diff -r a6aa72c10a1a -r f11174c80076 uuid/uuid.mli
--- a/uuid/uuid.mli	Fri Sep 03 16:57:08 2010 +0100
+++ b/uuid/uuid.mli	Fri Sep 03 16:57:15 2010 +0100
@@ -27,6 +27,9 @@
 
 (** Create a fresh UUID *)
 val make_uuid : unit -> 'a t
+val make_uuid_prng : unit -> 'a t
+val make_uuid_urnd : unit -> 'a t
+val make_uuid_rnd : unit -> 'a t
 
 (** Create a UUID from a string. *)
 val of_string : string -> 'a t
_______________________________________________
xen-api mailing list
[email protected]
http://lists.xensource.com/mailman/listinfo/xen-api

Reply via email to