これら 2 つの頭字語がよく使われていますが、GUID と UUID には何か違いがあるのでしょうか?
ベストアンサー1
簡単な答えは、違いはなく、同じものであるということです。
最も実用的な目的では、これらを一意の識別子として使用される 16 バイト (128 ビット) の値として扱います。Microsoft 用語では GUID と呼ばれますが、Microsoft 用語を使用しない場合は UUID と呼びます。
UUID 仕様の作成者と Microsoft でさえ、それらは同義語であると主張しています。
IETFの紹介からRFC 4122「ユニバーサル一意識別子 (UUID) URN 名前空間」: 「UUID (ユニバーサル一意識別子) の Uniform Resource Name 名前空間。GUID (グローバル一意識別子) とも呼ばれます。」
からITU-T勧告X.667、ISO/IEC 9834-8:2004国際標準: 「UUID はグローバル一意識別子 (GUID) とも呼ばれますが、この推奨事項ではこの用語は使用されません。」
そしてマイクロソフトは請求GUID は、UUID RFC によって指定されます。「Microsoft Windows プログラミングおよび Windows オペレーティング システムでは、[RFC4122] で指定されているグローバル一意識別子 (GUID) は... ユニバーサル一意識別子 (UUID) という用語は、Windows プロトコル仕様で GUID の同義語として使用されることがあります。」
詳しい回答
しかし、正しい答えは「場合による」です。質問で「UUID」と書かれている場合、その意味によって異なります...
最初の部分は、質問者が「UUID」と言うときに何を考えているかによって異なります。
Microsoft の主張は、すべての UUID が GUID であることを暗示しています。しかし、すべての GUID は実際の UUID なのでしょうか? つまり、すべての UUID のセットは、すべての GUID のセットの適切なサブセットなのでしょうか、それともまったく同じセットなのでしょうか?
RFC 4122の詳細を見ると、UUIDには4つの異なる「変種」がある。これは主に、これらの仕様がUUID仕様の作成にまとめられる前に、このような16バイトの識別子が使用されていたためである。RFC 4122UUID には次の 4 つのバリエーションがあります。
- 予約済み、ネットワーク コンピューティング システムの下位互換性
- RFC 4122 で指定されているバリアント(「バージョン」と呼ばれる5 つのサブバリアントがあります)
- 予約済み、Microsoft Corporation 下位互換性
- 将来の定義のために予約されています。
RFC 4122 によれば、すべての UUIDバリアントは「実際の UUID」であり、すべての GUID は実際の UUID です。「GUID と UUID に違いはありますか」という文字通りの質問に対する答えは、RFC 4122 UUID の場合、間違いなく「いいえ」です。違いはありません(ただし、以下の 2 番目の部分は適用されます)。
しかし、すべての GUID がバリアント2 UUID というわけではありません (たとえば、Microsoft COM にはバリアント 3 UUID である GUID があります)。質問が「GUID とバリアント 2 UUID に違いはありますか」である場合、答えは「はい」になります。これらは異なる場合があります。質問をしている人はおそらくバリアントについて知らず、「UUID」という言葉を言うときにバリアント2 UUIDのことだけを考えている可能性があります(たとえば、MAC アドレス + 時間や乱数アルゴリズム形式の UUID については漠然と知っていますが、これらは両方ともバリアント2のバージョンです)。その場合、答えは「はい、異なります」です。
したがって、答えは、質問者が「UUID」という言葉を言うときに何を考えているかによって部分的に異なります。彼らはバリアント 2 UUID (それが彼らが知っている唯一のバリアントであるため) を意味しているのでしょうか、それともすべての UUID を意味しているのでしょうか?
2 番目の部分は、UUID の定義として使用されている仕様によって異なります。
わかりにくいと思ったら、ITU-T X.667 ISO/IEC 9834-8:2004これは、技術的に完全に互換性があり、RFC 412211.2 項には、「この勧告 | 国際標準に準拠するすべての UUID は、オクテット 7 のビット 7 が 1 に設定され、オクテット 7 のビット 6 が 0 に設定されたバリアント ビットを持つものとする」という追加の文があります。これは、バリアント2 UUID のみがその標準に準拠していることを意味します (これらの 2 つのビット値はバリアント2 を意味します)。これが真実である場合、すべての GUID が ITU-T/ISO/IEC UUID に準拠しているわけではありません。準拠する ITU-T/ISO/IEC UUID はバリアント2 値のみであるためです。
したがって、実際の答えは、質問がどの UUID 仕様について尋ねているかによっても異なります。明らかに、Variant 2 UUID だけではなくすべての UUID について話していると仮定すると、 GUID と IETF の UUID の間に違いはありませんが、GUID と準拠するITU-T/ISO/IEC の UUID の間には違いがあります。
実用的なメモ
上記の情報では、UUID/GUID 値の詳細や、それらの取得/生成方法については説明していません。ただし、値に関して誤解されていることが 2 つあり、それらを解消する必要があります。
1. UUID/GUIDの表現
まず、同じ UUID/GUID は、さまざまな方法で表現できる 16 バイト (128 ビット) の値です。
メモリまたはストレージでは、バイナリ データとしてコンパクトに表現できます。たとえば、16 バイトの配列、8 つの 16 ビット ワード、または 4 つの 32 ビット整数 (符号付きまたは符号なし) として表現できます。ワードまたは整数を使用する場合は、エンディアンは重要です。
テキストまたは文字列では、通常、ハイフン付きの 16 進数で表されます。
hhhhhhhh-hhhh-Yhhh-Xhhh-hhhhhhhhhhhh
ここで、h、X、Y は 16 進文字です。
一部のプログラムでは、大文字のみ、または小文字のみを受け入れる場合がありますが、大文字と小文字は UUID/GUID の値には重要ではありません。一部のプログラムでは、ハイフンを省略するか、ハイフンの位置のみに配置する必要がありますが、ハイフンは UUID/GUID の値には重要ではありません。
ハイフンの位置は、UUID の時間ベース バージョンを反映しており、さまざまな時間、クロック、MAC アドレス フィールドを分離します。明らかに、これらのフィールドは他のバージョンの UUID では意味を持ちません。ただし、慣例により、ハイフンのこれらの位置は引き続き使用されます。
2. バイトの解釈
次に、UUID/GUID を生成するには必ずライブラリを使用します。16 バイトのランダム バイトを生成しても、有効な UUID/GUID が保証されるわけではありません。バージョン 4 の UUID を使用する場合でも、一部のバイトには特定の値が必要です。
上記の 16 進文字列テンプレートでは、位置 X の 16 進文字の 3 ビットが UUID のバリアントをエンコードします。RFC 4122 で定義されているバリアントの場合、X は 8、9、A、または B のいずれかになります。
UUID が RFC 4122バリアントである場合、位置 Y の 16 進文字で表されるビットはそのバージョンをエンコードします。たとえば、4 はバージョン 4 を示します。
16 バイトをランダムに生成しても、その 2 つのフィールドのバイトの値が正しいことは保証されません。
詳細については、RFC 4122ただし、通常は内部構造を知る必要はありません。与えられた値だけを使用する場合は、一意の識別子として使用される 16 バイト (128 ビット) の値として扱います。