このページの本文へ

前へ 1 2 次へ

Windows Info 第321回

Windowsのレジストリなどに見られるGUIDとは?

2022年04月03日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

 Windowsのレジストリなどを見ると、波カッコ「{}」に囲まれた16進数の羅列を見ることがある。これをGUID(Globally Unique Identifier)という。GUIDは、Windowsでユニークな識別子として使われる128bit(16バイト)の数値である。GUIDは、WindowsのAPIで作成することができ、他のマシンで作られたGUIDであっても、衝突することが極めてまれで、事実上起こらないと考えてもよいレベルのものだ。

Windows Terminalではプロファイルの識別にGUIDを利用している。GUIDは多くの場合、波カッコに囲まれた5つの16進数として表示される

 Windowsでは、オブジェクトやクラスの定義などに使われる。数値なので比較が容易で検索処理などを高速化できる。

 このGUIDは、UUIDと呼ばれる識別子の一種だ。Windowsでは、UUIDの一部をGUIDと呼んで利用している。このため、Windows上ではGUIDとUUIDを混同することがある。しかし、あくまでGUIDはUUIDの一種なので、GUIDはUUIDであると言うことは必ずしも間違いではないが、UUIDをGUIDと言ってしまうと誤解が生じる可能性がある。そこで今回はGUIDとUUIDについて簡単に解説する。

まず、UUIDとはなんぞや?

 GUIDを説明するには、まずUUIDを説明しておく必要がある。UUIDとは、RFC2144などで定義される128bit(16バイト)の数値で、インターネットやシステム内部などでさまざまなものの識別に使う。

 UUIDには、個別に生成したときに衝突をできる限り小さくするために、生成のルールが定められている。逆に言えば、UUIDのルールに従わないものは同じ128bitの数値であってもUUIDではない。UUIDの定義は複数の文書でなされているが、互いに衝突しないように調整されている。UUIDの定義の1つであるRFC2144では、5つの生成ルールと4つの変種(バリアント)が定義されている。

 RFC2144では、生成ルールを「バージョン」と呼ぶ。UUIDが歴史的な経緯をたどってきたため、過去との互換性を持ちながら、衝突しないルールを追加してきたため、バージョンという名称が使われる。

 バリアントは、主に過去との互換性を維持するためのものだ。バージョンとは独立して指定できるものだが、どちらかと言えば、過去に使ってしまった範囲を除外するような使い方をする。UUIDとして任意のバージョンとバリアントの組み合わせが可能だが、これを受け付けるかどうかはソフトウェア側の問題である。ソフトウェアには他と区別できれば、どのような128bit数値でもかまわないというレベルから、特定のUUIDバージョン、バリアントでないと受け付けないものまで存在する可能性がある。

UUIDバージョンは5つ存在する

 RFC2144で定義しているバージョンは、以下の表の5つである。バージョンは、4bitの数値なので、最大16種類あり、他の文書で6番目以降のバージョンが定義される可能性がある。

 このうち、WindowsでGUIDと呼んでいるのは、バージョン1およびバージョン4。WindowsにはUUIDバージョン1およびバージョン4を生成するAPIが用意されているが、バージョン1では、ローカルマシンのMACアドレスを利用するため、セキュリティ上の懸念がある。このため、最近ではバージョン4を使うことが標準とされているようだ。

 もちろん外部からのアクセスがなく、部外者が知り得ないという環境であれば、バージョン1を使うこともできる。Microsoftのドキュメントによると、こちらのほうが若干高速になり、大量に生成する場合にメリットがあるという。

 バージョン4は、乱数を使って作るUUIDで値の範囲としてはバージョン4bit、バリアント2bitを除く122bitを使うため、2の122乗個のUUIDが存在する。ある程度妥当な乱数生成をするなら、これだけ大きな数値同士が一致する可能性は非常に低く、現実的には起こりえないと考えて問題ない。

UUIDの構造を見る

 UUIDは、以下の図のような構造になっており、GUIDが前記のように5つのパートに別れているのには、この構造が関係している。つまり、ハイフンで区切られた5つの数値は、それぞれUUIDの「time_low」「time_mid」「time_hi_and_version」「clock_seq_hi_and_reservedとclock_seq_low」「node」に対応している。

128bitのUUIDはこのような構造になっており、文字列表現形式では、この構造に合わせて5つのパートに分けて表示されている。3つめの16進数の先頭がバージョン、4つめの16進数の先頭がバリアントに対応している

 このうち、3つめのパートの先頭がバージョンであり、4つめのパートの先頭がバリアント(以下の表)に相当する数値となる。最初の桁が8~Bまでの間ならRFC2144で定義されたUUIDである。これを覚えておくと、UUIDやGUIDを見ただけで、どのバージョン、バリアントなのかを判断できる。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン