UUIDs (Universally Unique Identifier) or GUIDs (Globally Unique Identifier) are defined in this document: [http://www.webdav.org/specs/draft-leach-uuids-guids-01.txt] ---- [PT] 8-Jul-2004: I have just added a UUID module to [tcllib] that implements type 4 uuids from the draft specification document. eg: % package require uuid 1.0.0 % set id [uuid::uuid generate] 140d7c2c-4502-4144-6ae0-a4692e8ed819 % if {[uuid::uuid equal $id $id]} { puts "ids equal" } [JMN] 2005-11-26. On one of my windows machines - UUID version 1.0.0 calls to [[uuid:uuid generate]] take around 4.5 seconds to complete. This makes the function impractical for most uses. The delay seems to occur in a call to 'fconfigure -sockname'. I don't know if it's a peculiarity of my machine's network configuration or not - but even so it seems to me that this tcllib package should avoid calls that may take such a relatively long time. ---- Windows provides an API for generating GUIDs and some extensions make use of this, but I needed a pure-[Tcl] UUID generator. So, I came up with this. This proc, by no means, conforms to the standards discussed in the above document, but it does produce unique* identifiers that are good enough for me. :) [Damon Courtney] proc uuid {} { ## Try and get a string unique to this host. set str [info hostname]$::tcl_platform(machine)$::tcl_platform(os) binary scan $str h* hex set uuid [format %2.2x [clock seconds]] append uuid -[string range [format %2.2x [clock clicks]] 0 3] append uuid -[string range [format %2.2x [clock clicks]] 2 5] append uuid -[string range [format %2.2x [clock clicks]] 4 end] append uuid -[string range $hex 0 11] return $uuid } proc guid {} { ## Return a GUID for Windows, which is just an uppercase UUID with braces. return \{[string toupper [uuid]]\} } *[JMN] 2005-11-26 Note that the above 'guid' function does not produce unique values for quick successive calls. e.g using the following script, you will most likely get the same value in a, b & c. foreach {a b c} [list [guid] [guid] [guid]] {break} For a result that is more likely to be unique - you may want to add a call to [[expr {rand()}]] or similar. ---- [Scott Nichols] I wrote a Windows C based Tcl extension for this ([TclGetGUID]) a few months back, and Pat helped by recommending the use of the Tcl C API call Tcl_UtfToUpper for converting a string to uppercase. The C source is really short and simple. It simply calls some underlying Windows APIs. ---- [DKF]: Don't forget to include planet and stellar system identifiers in that UUID... :^D ---- [Category Glossary] | [Category Package] distributed as a module in [Tcllib]