Skip to content
This repository has been archived by the owner on May 22, 2018. It is now read-only.

Commit

Permalink
Add functions to get UUIDs of different qualities.
Browse files Browse the repository at this point in the history
Signed-off-by: Magnus Therning <magnus.therning@citrix.com>
  • Loading branch information
Magnus Therning committed Oct 12, 2010
1 parent bd8bf98 commit 98cb4e9
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 7 deletions.
Empty file modified autogen.sh
100644 → 100755
Empty file.
39 changes: 32 additions & 7 deletions uuid/uuid.ml
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -30,12 +30,34 @@ let string_of_cookie s = s


let cookie_of_string s = s let cookie_of_string s = s


(* FIXME: using /dev/random is too slow but using /dev/urandom is too let dev_random = "/dev/random"
deterministic. *) let dev_urandom = "/dev/urandom"
let dev_random = "/dev/urandom"


let read_random n = let rnd_array n =
let ic = open_in_bin dev_random in 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 try
let result = Array.init n (fun _ -> input_byte ic) in let result = Array.init n (fun _ -> input_byte ic) in
close_in ic; close_in ic;
Expand All @@ -50,10 +72,13 @@ let uuid_of_int_array uuid =
uuid.(6) uuid.(7) uuid.(8) uuid.(9) uuid.(10) uuid.(11) uuid.(6) uuid.(7) uuid.(8) uuid.(9) uuid.(10) uuid.(11)
uuid.(12) uuid.(13) uuid.(14) uuid.(15) 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 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) String.concat "" (List.map (Printf.sprintf "%1x") bytes)


let int_array_of_uuid s = let int_array_of_uuid s =
Expand Down
3 changes: 3 additions & 0 deletions uuid/uuid.mli
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ type 'a t


(** Create a fresh UUID *) (** Create a fresh UUID *)
val make_uuid : unit -> 'a t 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. *) (** Create a UUID from a string. *)
val of_string : string -> 'a t val of_string : string -> 'a t
Expand Down

0 comments on commit 98cb4e9

Please sign in to comment.