UUID

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

UUIDUniversally Unique Identifier)とは、ソフトウェア上でオブジェクトを一意に識別するための識別子である。UUIDは128ビットの数値だが、十六進法による550e8400-e29b-41d4-a716-446655440000というような文字列による表現が使われることが多い。元来は分散システム上で統制なしに作成できる識別子として設計されており、したがって将来にわたって重複や偶然の一致が起こらない前提で用いることができる。[1]マイクロソフトによるGUIDはUUIDの実装の1つと見なせる。[2]

規格[編集]

Network Computing Systemで導入され、それをDistributed Computing Environment (DCE)の一部としてOpen Software Foundation (OSF)が標準化し、ISO/IEC 11578:1996 "Information technology -- Open Systems Interconnection -- Remote Procedure Call (RPC)"の一部として文書化されている。またIETFはUUIDに関してRFC 4122 を公開している。

バリアント[編集]

UUIDには歴史的経緯から数種類のバリアント(変種)があり、現行の規格で定められているのはそのうちの1つに過ぎない。16進表記をした場合にxxxxxxxx-xxxx-xxxx-Nxxx-xxxxxxxxxxxxのNの桁の上位ビットがバリアントを示す。現行の規格では上位2ビットが10であることが定められているので、16進表記では8,9,A,Bのいずれかとなる。これ以外のバリアントは、規格制定以前に生成されたUUIDとの後方互換性、あるいは将来のために予約されている。全てゼロのUUIDも、こうしたバリアントの一つである。

Msb0 Msb1 Msb2 バリアント
0

Network Computing Systemへの後方互換性のために予約
1 0
RFC4122で規格化されたバリアント
1 1 0 マイクロソフトがCOMで用いているGUIDとの後方互換性のために予約
1 1 1 将来のために予約

バージョン[編集]

現行規格で定められているバリアントには、さらに生成方法が異なる複数の種類があり、これをバージョンと呼んでいる。16進表記をした場合にxxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxxのMの桁がバージョン(1から5)を示す。なお以降の16進表記でNの桁が小文字になっているのはバリアントの情報が含まれることを示す。

バージョン1[編集]

もともとの生成法である、時刻とMACアドレスを利用したUUID。16進表記をするとTTTTTTTT-TTTT-1TTT-sSSS-AAAAAAAAAAAAのような構造になっており、それぞれタイムスタンプ(T:60ビット)、クロックシーケンス(S:14ビット+上位2ビットが10)、ノード(A:48ビット)からなる。

タイムスタンプはUUID生成時刻(協定世界時)における1582年10月15日(カトリック教会におけるグレゴリオ暦の実施日)0時0分からの経過時間を100ナノ秒単位で計測した数値。60ビットで3653年分の時刻を扱えるため、西暦5235年までこの方法を用いることができる。

ノードはUUIDを生成した装置を一意に示す値で、普通はネットワークカードに(通常一意に)与えられているMACアドレスを用いる。複数あるときは任意に一つを選択してよい。またMACアドレスが存在しない場合には、乱数を生成してマルチキャストビットを立てて用いることができる。

クロックシーケンスは、時計が巻戻ったりMACアドレスが変わった場合に、UUIDの重複が生じることを防ぐために変更する値である。時刻の進みを修正すると、同じ時刻を2回以上使うことでUUIDが重複するおそれがある。また装置間で設定されている時刻がわずかに異なる可能性があるが、時刻が進んだ装置から遅れた装置にネットワークカードを移設すると、結果的に同じ時刻・同じMACアドレスを2回以上使う可能性が出てくる。そこでクロックシーケンスをあらかじめ乱数で初期化しておき、時刻の巻戻りを検出したら値を1つ増やすことで重複を回避する。クロックシーケンスは14ビットしかないので、もし巻戻りのたびに乱数を使ってしまうと誕生日パラドックスにより重複を起こす可能性が高くなる。しかしカード移設の場合は、前にそのカードを使っていた装置で使っていたクロックシーケンスを知ることは難しいため、乱数で再初期化せざるを得ない。

バージョン1のUUIDの特徴として、同じ装置で生成された事実やUUID生成の前後関係を知ることができる。またMACアドレスは人為的に差し替え可能であり、100ナノ秒以内に複数のUUIDを生成することも可能なことから、これらが一意性を損なう原因となり得る。

バージョン2[編集]

DCEシステムにおける権限認可を目的に設計されたもので、バージョン1のUUIDの一部を、POSIXのユーザーIDやグループIDで差し替えたもの。16進表記ではIIIIIIII-TTTT-2TTT-dDDD-AAAAAAAAAAAAとなり、タイムスタンプの一部とクロックシーケンスをそれぞれローカルID(I:32ビット)とローカルドメイン(D:14ビット+上位2ビットが10)で置き換えている。ローカルドメインはローカルIDの種類を示す値で、ユーザーIDを用いる場合には0(16進表記で8000)、グループIDを用いる場合には1(16進表記で8001)となる。[3]

バージョン3/5[編集]

ドメイン名などなんらかの一意な名前(バイト列)を用いたUUIDで、ハッシュ関数としてMD5(バージョン3)またはSHA1(バージョン5)を利用したもの。すでに一意であることがわかっている物があり、それと(事実上)1対1に対応するUUIDが必要な場合に用いられる。16進表記ではHHHHHHHH-HHHH-3HHH-hHHH-HHHHHHHHHHHHHHHHHHHH-HHHH-5HHH-hHHH-HHHHHHHHHHHHとなり、そのほとんどがハッシュ値に由来する(H:122ビット)。用いる名前はFQDNURLX.500 DNなど何でもよいが、それぞれの名前空間自体に固有のUUIDが割り当てられている必要がある。名前空間のUUID(バイト列)と名前を繋げてハッシュ値を計算し、それを名前のUUIDへと変換する。MD5の場合の変換は、128ビットのハッシュ値にバリアント(10)とバージョン(0011)を上書きする。SHA1は160ビットのハッシュだが、下位32ビットを切り捨て128ビットにした上で、同様にバリアント(10)とバージョン(0101)を上書きすることで変換する。

バージョン4[編集]

乱数によるUUID。16進表記ではRRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRRとなり、バリアント(10)とバージョン(0100)を除くすべてのビットを乱数(R:122ビット)で生成する。

脚注[編集]

[ヘルプ]
  1. ^ 乱数に基づくUUID(UUID version 4)の場合、およそ5.3×1036通り()存在し、正しく生成されていれば、誕生日のパラドックスによっても、生成したあるIDが他で生成されたIDと偶然一致する確率は、1/261である。
  2. ^ バイト列としては非互換だが16進表記は互換性がある。
  3. ^ The Open Group (1997年). “DCE 1.1: Authentication and Security Services”. 2016年5月17日閲覧。