Tips

UUIDを生成するメソッド

日付2009/08/21
ID75873 (英語原文参照)
バージョン11.4
プラットフォームMac & Win

Wikipediaからの引用:

http://ja.wikipedia.org/wiki/汎用一意識別子

汎用一意識別子(はんよういちいしきべつし、Universally Unique Identifier、以下UUIDと表記)とは、Distributed Computing Environment (DCE)の一部としてOpen Software Foundation (OSF)が標準化した、一意に識別するための識別子である。UUIDは、分散システム上でどこかが統制を取らずとも、一意に特定可能な識別子の作成を目的としており、UUIDは重複や偶然の一致が起こりえないと確信して用いることができる。(UUIDを付された情報は、したがって、名前の衝突を解決する必要なく、後に単一のデータベースに統合することができる。)―括弧内は英文より。

4D v11 SQLは、内部的にUUIDを多用しています。iCalendarフォーマットでは、カレンダーやイベントをUUIDで管理し、コンピュータに搭載されているハードドライブもUUIDを有しています。

下記のメソッドは、RFC4122で定義されたバージョン4のUUIDを生成するものです。乱数の生成には、Tips 75874「一定範囲内の乱数を返すメソッド」を使用しています。

'UTIL_NewUUID -> STRING

C_TEXT($0;$UUID_T)
C_LONGINT($Ndx;$Idx;$SOA;$RIS;$Rnd_L;$End_L)
C_TEXT($Chars_T)

`====================== Initialize and Setup ================================

$Chars_T:="0123456789abcdef"
$End_L:=Length($Chars_T)-1

`======================== Method Actions ==================================

`// rfc 4122 requires this format for a version 4 (random number) UUID
$UUID_T:="########-####-4###-####-############"


For ($Ndx;1;Length($UUID_T))
    If ($UUID_T[[$Ndx]]="#")
        $Rnd_L:=UTIL_Random (0;$End_L)
        If ($Ndx=20)
            `Must be a value of 8, 9, a, or b
            $Idx:=($Rnd_L & 0x0003) | 0x0008
        Else 
            $Idx:=$Rnd_L
        End if 
        $UUID_T[[$Ndx]]:=$Chars_T[[$Idx+1]]
    End if 
End for 

`======================== Clean up and Exit =================================

$0:=$UUID_T