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

この連載の記事
-
第470回
PC
Windows用のパッケージマネージャー「Winget」 プレビュー版で機能が充実してきた -
第469回
PC
Windows Updateの27年 悪役だった頃から改良が進んで、徐々に目立たない存在に -
第468回
PC
2025年のWindowsどうなる!? Windows Insider Programの状況をあらためて見る -
第467回
PC
Copilot+ PCのNPUでカメラを処理する「Windows Studio Effects」 その内容や効果は? -
第466回
PC
PowerToysの最近の新機能には、複数アプリを指定位置に起動する「ワークスペース」や新規作成のカスタマイズがある -
第465回
PC
WindowsのPowerShellからBluetoothデバイスを調べる -
第464回
PC
Windows 10のサポート切れまで1年を切った さてWindows 10マシンをどうする? -
第463回
PC
Windows Terminal Preview版でSixelグラフィックスを実際に表示させてみる -
第462回
PC
Windows Terminal Preview版でSixelグラフィックスを扱う -
第461回
PC
Copilot+ PCを買ってみたが、「今焦って買う必要はない」のかもしれない -
第460回
PC
Windowsでsftpを使う - この連載の一覧へ