UUIDの事。
RFC4122より、断片的につまみ食い/駄訳
UUID
UUID = ゆゆ様いったいどんだけ食うねんUniversally Unique IDentifierの略
通りのユニークな値なので、多分これで大丈夫でしょうと言う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です