at_yasu's blog

ロード的なことを

UUIDの事。

RFC4122より、断片的につまみ食い/駄訳

UUID

UUID = ゆゆ様いったいどんだけ食うねんUniversally Unique IDentifierの略

256^{16}通りのユニークな値なので、多分これで大丈夫でしょうと言うID。

表記は、xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。それぞれの意味はこんな感じ。

timelow "-" timemid "-" timehigh-and-version "-" clockseq-and-reserved clockseqlow "-" node

  • timelow : 4hexOctet
    • 32bitの整数。timestampの下位
  • timemid : 2hexOctet
    • 16bitの整数。timestampの中間
  • timehigh-and-version : 2hexOctet
    • 16bitの整数。timestampの上位と、バージョン番号の合成数
  • clockseq-and-reserved : hexOctet
    • 8bitの整数。上位部のクロックシーケンスとvariant?
  • clockseqlow : hexOctet
    • 8bitの整数。下位部のクロックシーケンス
  • node : 6hexOctet
    • 48bitの整数。ユニークな整数で、ノード識別子として利用。
  • hexOctet : hexDigit hexDigit
  • hexDigit : 0-9/a-f/A-F

URN 表記だと、

urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6

種類

1,2,3,4,5 のバージョンがある。timehigh-and-version の 4-7bitがバージョン番号に当たる。

Msb0 Msb1 Msb2 Msb3 Version Description
0 0 0 1 1 time基準のバージョン
0 0 1 0 2 DCEセキュリティバージョン、POSIX UID
0 0 1 1 3 name-basedバージョン、MD5Hashを使う
0 1 0 0 4 ランダムないしは疑似ランダムから作るバージョン
0 1 0 1 5 name-basedバージョン、SHA-1Hashを使う


特殊な物として、NilUUID(Section 4.1.7)がある。

urn:uuid:0000000-0000-0000-0000-000000000000

それぞれのフィールドの意味付け

Timestamp

60bitの値。

  • version1
    • 1582/10/15 00:00:00.00 から10ナノ秒をカウントしたUTC時間。
    • ちなみにこの日は、キリスト暦からグレゴリオ暦へ変えた日らしい
  • version 3,5
    • 名前ベースから作った60bitの値が入る
    • version 4
    • ランダムないしは疑似ランダムの60bitの値
Clock Sequence

よくわかんない。CPUClockっぽいけど、注意書きが長いというか気力果てた。

node
  • Version1
    • IEEE 802 Macアドレス。複数のMacアドレスがあるときはどれか一つ。
  • Version 3,5
    • namebaseからの48bit
  • Version4
    • 疑似ランダムとかランダムからの48bit

Name-based UUID

この場合のname-basedは、例えば、ドメインやURLやISO ObjectIDやX.500デジタル署名とかとか。

いろいろ注意があるけど、読むのが面倒。
いつかへ後回し

ランダムないしは疑似ランダム

version 4 のみ、ランダム/疑似ランダムから生成する。

Version1の事

IEEE 802 Macアドレスから作るけど、作るにはUS$550が必要。じゃないと、ユニークなMac作れないからね。

てなわけで、使う事には消極的。

使うときは、コンピュータの識別とかその辺でしょという事が書かれてるっぽい。

使われている(2005年の時点で)システム

MS Windows とか Mozilla ブラウザーが使ってた。*1

使う際の注意

あくまで識別子なだけで、セキュリティ的な部分には向いていませんよ〜

Pythonだと

こんな感じ。

>>> import uuid
>>> uuid.uuid1()
UUID('4f8c52c2-d351-11de-9d26-001ff346bdd3')
>>> uuid.uuid1()
UUID('4fea5016-d351-11de-9d26-001ff346bdd3')
>>> uuid.uuid4()
UUID('b20469aa-ada8-4ef3-a6f7-5bdcdbc7ae63')
>>> uuid.uuid4()
UUID('689d7ac0-8dfe-4261-8915-bb5c4cb6c939')

*1:SecondLifeにある、Objectの識別子もUUIDです