From fc35d20e4e84902183ffbd4d903cdd55297eedfc Mon Sep 17 00:00:00 2001 From: Stefano Zacchiroli Date: Fri, 10 Jan 2003 09:10:09 +0000 Subject: [PATCH] implemented random id generation --- helm/hbugs/common/hbugs_id_generator.ml | 44 ++++++++++++++++++++----- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/helm/hbugs/common/hbugs_id_generator.ml b/helm/hbugs/common/hbugs_id_generator.ml index 93d349b74..f535f4739 100644 --- a/helm/hbugs/common/hbugs_id_generator.ml +++ b/helm/hbugs/common/hbugs_id_generator.ml @@ -26,12 +26,40 @@ * http://helm.cs.unibo.it/ *) -let new_broker_id () = (* TODO write a real id generator! *) - "FOO BROKER ID!" -let new_client_id () = (* TODO write a real id generator! *) - "FOO CLIENT ID!" -let new_musing_id () = (* TODO write a real id generator! *) - "FOO MUSING ID!" -let new_tutor_id () = (* TODO write a real id generator! *) - "FOO TUTOR ID!" +let _ = Random.self_init () + +let id_length = 32 +let min_ascii = 33 +let max_ascii = 126 + (* characters forbidden inside an XML attribute value. Well, '>' and ''' + aren't really forbidden, but are listed here ... just to be sure *) +let forbidden_chars = (* i.e. [ '"'; '&'; '\''; '<'; '>' ] *) + [ 34; 38; 39; 60; 62 ] (* assumption: is sorted! *) +let chars_range = max_ascii - min_ascii + 1 - (List.length forbidden_chars) + + (* return a random id char c such that + (min_ascii <= Char.code c) && + (Char.code c <= max_ascii) && + (not (List.mem (Char.code c) forbidden_chars)) + *) +let random_id_char () = + let rec nth_char ascii shifts = function + | [] -> Char.chr (ascii + shifts) + | hd::tl when ascii + shifts < hd -> Char.chr (ascii + shifts) + | hd::tl (* when ascii + shifts >= hd *) -> nth_char ascii (shifts + 1) tl + in + nth_char (Random.int chars_range + min_ascii) 0 forbidden_chars + + (* return a random id string which have length id_length *) +let new_id () = + let str = String.create id_length in + for i = 0 to id_length - 1 do + String.set str i (random_id_char ()) + done; + str + +let new_broker_id = new_id +let new_client_id = new_id +let new_musing_id = new_id +let new_tutor_id = new_id -- 2.39.2