Get UUID on *NIX

Difference between version 3 and 4 - Previous - Next
Created by [CecilWesterhof].

**Getting an UUID on a *NIX System**


There are some problems with getting the [UUID] (type 4) on *NIX systems. For one they are not really random.

Because of this I created the following function:
======
proc getUUIDNix {{secure False}} {
    set fortyeightBits [expr {2 ** 48 - 1}]
    set sixteenBits    [expr {2 ** 16 - 1}]
    set thirtytwoBits  [expr {2 ** 32 - 1}]
    set twelfBits      [expr {2 ** 12 - 1}]

    format %.8x-%.4x-4%.3x-%x%.3x-%.12x \        [getRandomIntInRangeNix 0 ${thirtytwoBits}] \
        [getRandomIntInRangeNix 0 ${sixteenBits}]   \
        [getRandomIntInRangeNix 0 ${twelfBits}]     \
        [getRandomIntInRangeNix 8 11]               \        [getRandomIntInRangeNix 0 ${twelfBits}]     \
        [getRandomIntInRangeNix 0 ${fortyeightBits} False True]
}
======

It uses getRandomIntInRangeNix from [Random Integers].

'''A Better way'''

The above version is a straight implementation. But a more efficient implementation is:
======
# An UUID is built from 5 hex strings connected by a '-'.
# Their lengths are 8, 4, 4, 4 and 12.
# With version 4 the folowing is necessary:
# - The first digit from the third string is a 4
# - The first digit from the fourth string is 8, 9, A or B.
# The five random hex strings are generated.
# The first digits of the third and fourth strings are changed.
# The UUID is build from the five strings and returned.
# Because binary scan returns lowercase letters toupper is used.
proc getUUIDNix {} {
    binary scan   [getRandomBytesNix 16] H8H4H4H4H12 hex1 hex2 hex3 hex4 hex5    set    hex3   [string replace ${hex3} 0 0 4]
    set    oldVal [scan [string index ${hex4} 0] %x]
    set    newVal [format %X [expr {(${oldVal} & 3) | 8}]]
    set    hex4   [string replace ${hex4} 0 0 ${newVal}]
    string toupper ${hex1}-${hex2}-${hex3}-${hex4}-${hex5}
}
======

This uses getRandomBytesNix from [Get Random Bytes on *NIX].

----

As always: comments, tips and questions are appreciated.

** See also **

   * [UUID] for other implementations

** Discussion **

<<categories>>Linux | Utilities