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. [PT] 2005-11-27: you should raise a bug report on [sourceforge] if you have not already done so. My answer is that some time before the tcllib 1.8 release we stopped using information from the socket call because it can be a problem when the XP firewall is in place. Obtain uuid 1.0.1. A second method it to use ActiveTcl or build the critcl extensions for tcllib. The uuid package includes critcl code which it will use if it can and this calls directly to the Win32 UuidCreate API. ---- 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]