UUID
UUID(Universally Unique Identifier)や汎用一意識別子(はんよういちいしきべつし)やユニバーサル一意識別子(ユニバーサルいちいしきべつし)は、ソフトウェア上でオブジェクトを一意に識別するための識別子である。 UUIDは128ビットの数値だが、16進法による 分散システム上での利用を考慮して設計されており、統制なしに作成しても重複や偶然の一致が事実上起こらないものとして使用できる[注釈 1]。 マイクロソフトによるGUIDは、UUIDの実装の1つとされる。 規格Network Computing Systemで導入され、それをDistributed Computing Environment(DCE)の一部としてOpen Software Foundation(OSF)が標準化し、「ISO/IEC 11578:1996 "Information technology -- Open Systems Interconnection -- Remote Procedure Call (RPC)"」の一部として文書化されていた。その後、ISOは ISO/IEC 9834-8:2005[1]、ISO/IEC 9834-8:2008[2] 、ISO/IEC 9834-8:2014[3] と改訂した。ISOの仕様はRFCを追いかけていて、基本的に同一である。 またIETFはUUIDに関して2005年7月にRFC 4122を制定し、2024年5月にRFC 9562に改訂した。 バリアントUUIDには歴史的経緯から数種類のバリアント(変種)があり、現行の規格で定められているのはそのうちの1つである。16進表記をした場合に
バージョンRFCで定められている仕様には、さらに生成方法が異なる複数の種類があり、これをバージョンと呼んでいる。16進表記をした場合に RFC 9562では、各バージョンに関して、仕様制定時の2024年5月現在として、以下のように問題点を記載している。一般の用途として推奨されるのはバージョン4と7になる。バージョン(4ビット)とバリアント(2ビット)を記載するために合計6ビット消費しているが、UUIDと互換であることが不要であれば、バージョン4の代わりに128ビット乱数を、バージョン7の代わりにULID[4]が使用できる。
バージョン1もともとの生成法である、時刻とMACアドレスを利用したUUID。16進表記をすると タイムスタンプはUUID生成時刻(協定世界時)における1582年10月15日(カトリック教会におけるグレゴリオ暦の実施日)0時0分からの経過時間を100ナノ秒単位で計測した数値。60ビットで3653年分の時刻を扱えるため、西暦5235年までこの方法を用いることができる。 ノードはUUIDを生成した装置を一意に示す値で、普通はネットワークカードに(通常一意に)与えられているMACアドレスを用いる。複数あるときは任意に一つを選択してよい。またMACアドレスが存在しない場合には、乱数を生成してマルチキャストビットを立てて用いることができる。 クロックシーケンスは、同一の機器で(同一のネットワークインタフェース(MACアドレス)を持ち)、かつ、時計の精度などのために同一のタイムスタンプにおいてUUIDを生成しなければならない場合に、同一のUUIDが重複しないように順次変更させて使う値である。この値はインクリメントなどで変更しなければならず、乱数列を使用してはならない。14ビットしかないので、乱数列では誕生日パラドックスにより容易に同一のUUIDを生成し得るからである。 また、機器の時刻管理やうるう秒による時刻の巻き戻りのために、あるいは、時刻が進んでいる装置から遅れている装置にネットワークカードを移設したような場合にも重複が発生し得る。前者への対応として、クロックシーケンスは新しいタイムスタンプの度にリセットしたりせず、最後に生成した時の状態を保持し、継続して更新しなければならない。しかし、後者への対応は、前にそのカードを使っていた装置で生成されたクロックシーケンスを知ることは難しいため、乱数で再初期化せざるを得ない。 バージョン1のUUIDの特徴として、同じ装置で生成された事実やUUID生成の前後関係を知ることができる。しかし、MACアドレスは人為的に差し替え可能であり、必ずしもあてにはできない。 RFC 9562ではバージョン1よりもバージョン7を使うべき(SHOULD)としている。 バージョン2DCEシステムにおける権限認可を目的に設計されたもので、バージョン1のUUIDの一部を、POSIXのユーザーIDやグループIDで差し替えたもの。16進表記では バージョン3/5ドメイン名などなんらかの一意な名前(バイト列)を用いたUUIDで、ハッシュ関数としてMD5(バージョン3)またはSHA-1(バージョン5)を利用したもの。すでに一意であることがわかっている物があり、それと(事実上)1対1に対応するUUIDが必要な場合に用いられる。16進表記では バージョン4バージョン4のUUIDは、乱数により生成される。他のUUIDと同様、バージョン4であることを示すために4ビットが使われ、バリアント(バリアント1と2に対して、それぞれ102または1102)を示すために2または3ビットが使われる。したがって、バリアント1(つまりほとんどのUUID)では、ランダムなバージョン4のUUIDの場合、6ビットはバリアントとバージョンビットのためにあらかじめ決定されており、ランダムに生成される部分には122ビットが残されている。よって、バージョン4バリアント1のUUIDは、2122すなわち約5.3×1036通り存在する[注釈 2][注釈 3]。16進表記では、 バージョン6バージョン1の改変で、time_low, time_mid, time_high の順番を逆にして、time_highが上位ビットに来るようにして、時間順でソートできるようにして、データベースでの局所性を高められる。古いバージョン1との互換性が不要であれば、RFC 9562はバージョン6ではなくバージョン7を使うべき(SHOULD)としている。 バージョン7バージョン7はバージョン6と同様に時間順でソート可能で、ミリ秒単位のUNIX時間を先頭48ビットに付けている。それにより、時刻が近いデータをまとめられるので、データベースのプライマリキーとして使用した場合、局所性を高められる。16進表記では、 128ビットの構成
バージョン8実験もしくはベンダー固有の用途用。バージョンとバリアント以外の部分は自由に使える。 バージョン9から15将来の使用のために予約。 ULIDUUID から派生した類似のものとして ULID (Universally Unique Lexicographically Sortable Identifier) がある。内容としてはUUIDバージョン7と近く(ULIDの方が古くRFC 9562では参考にしたものの1つとして記載している)、ミリ秒単位のUNIX時間を48ビット、乱数80ビットから構成される。文字列に変換する際は、CrockfordのBase32を使用し、I, L, O, U は見間違いを防ぐために含めない。文字列表記では26文字になる。[4] 使用例有名な使用例としては、ext2/ext3/ext4ファイルシステムのユーザー空間のツール[注釈 4]、LUKS暗号パーティション、GNOME、KDE、macOS[注釈 5]などがある。これらのほとんどは、セオドア・ツォーによるオリジナルの実装に由来する[11]。 Solarisでは、カーネルパニックが発生した場合において、クラッシュダンプのデータをFault Management Eventと照合 (pairing) する目的で、実行中のオペレーティングシステムのインスタンスを特定するためにUUIDが使用されている[12]。 Bluetooth Low Energyでは、GATTサービスやGATTキャラクタリスティックの識別にUUIDを使用する。一部のUUIDは規格によって特定の用途に予約されている。 クロスプラットフォームなプログラミング言語ではUUIDを生成したり文字列と相互変換したりするための機能が標準ライブラリとして用意されていることが多い。
オペレーティングシステムによっては、UUIDを生成するコマンドラインツール 脚注注釈
出典
関連項目
外部リンク
|