Skip to content

GUID とは?——構造、バージョン、一意性をわかりやすく解説

2026-05-24

タグ:Windows · GUID · 解説 · QuickGUID


Windows で開発をしたことがあるなら、一度は見たことがあるはずです。まるでランダムな十六進数の羅列のような、あの文字列:

6B29FC40-CA47-1067-B31D-00DD010662DA

レジストリの中、プロジェクトの設定ファイル、ログ出力、あるいはエラーメッセージの途中に現れるかもしれません。「GUID」という名前は知っているし、「たぶん一意なんだろう」とも思っている。でも、この文字列が本当は何なのか、なぜこんな形をしているのか、どうして重複しないのか——そういう疑問をじっくり考えたことは、おそらくないはずです。

今日はそのあたりを整理してみましょう。

UUID と GUID:同じものの別名

まず、意外と知られていない事実から:GUID と UUID は同じものです。

  • UUID(Universally Unique Identifier、汎用一意識別子)が正式名称で、RFC 4122 で定義されています。
  • GUID(Globally Unique Identifier、グローバル一意識別子)は、Microsoft が付けた別名です。

これだけです。UUID が標準名、GUID は Microsoft が COM、Windows API、.NET などの技術スタックで使っている呼び名です。Windows で見かける GUID も、Linux で見かける UUID も、本質的には同じものです。

本記事では以降、主に GUID という名前を使います——何しろ Windows 開発の話題ですから。

GUID の構造:ランダムに見えて、実は法則がある

標準的な GUID はこんな形をしています:

6B29FC40-CA47-1067-B31D-00DD010662DA

8-4-4-4-12、合計 32 文字の十六進数(128 ビット)がハイフンで 5 つに区切られています。ランダムに見えますが、実はきちんと構造があります:

6B29FC40-CA47-1067-B31D-00DD010662DA
              ↑    ↑
            バージョン  バリアント

ポイントは第 3 セグメントの 1 文字目と、第 4 セグメントの 1 文字目です:

  • バージョン(Version):第 3 セグメントの最初の十六進数字が、この GUID の生成アルゴリズムを示しています。1 なら v1、4 なら v4、7 なら v7 です。
  • バリアント(Variant):第 4 セグメントの最初の十六進数字が、どの標準仕様に従っているかを示します。89AB で始まるものは RFC 4122 準拠——普段目にする GUID のほとんどがこのバリアントです。

次に GUID を見かけたら、第 3 セグメントの先頭をちらっと確認するだけで、v1 か v4 か v7 かがわかります。見た目から読み取るよりずっと役立ちます。

GUID にはどんなバージョンがあるのか?

UUID 規格では複数のバージョンが定義されていますが、実際に使われているのは主に 3 つです:

v1:タイムスタンプ + MAC アドレス

v1 GUID は、現在のタイムスタンプ(100 ナノ秒精度)とネットワークインターフェースの MAC アドレスを組み合わせて生成されます。

長所:自然に時系列で並ぶ。短所:生成時刻がバレるうえ、MAC アドレスはハードウェア情報です——これはプライバシーとセキュリティの面で大きな問題になります。攻撃者は v1 GUID からネットワークアドレスと生成時刻を逆算できます。

そのため、今では v1 を使う人はほとんどいませんが、古いシステムにはまだ残っています。

v4:完全ランダム

v4 は現在最も一般的なバージョンです。バージョン番号とバリアントビットが固定されている以外、残りの 122 ビットはすべて乱数で埋められます

タイムスタンプなし、ハードウェア情報なし、純粋にランダム性だけで一意性を保証するシンプルな方式ですが、非常に効果的です。

プロジェクトで new Guid()uuid.uuid4()crypto.randomUUID() を呼び出して生成されるものは、ほぼ確実に v4 です。

v7:タイムスタンプでソート可能な新顔

v7 は 2024 年に正式に標準化された新しいバージョンです。先頭 48 ビットにミリ秒精度のタイムスタンプを格納し、残りのビットを乱数で埋めます。

なぜ v7 が作られたのか?v4 は優れていますが、完全にランダムなため、時間順にソートできません。これはデータベースにとって問題になります:

  • データベースで GUID を主キーにする場合、v4 では完全にランダムなため、挿入順序とインデックス順序が一致せず、B+ ツリーの頻繁な分割が発生し、書き込みパフォーマンスが低下します。
  • v7 は前半がタイムスタンプなので、自然に時間順に増加し、挿入順序とインデックス順序がほぼ一致するため、書き込みパフォーマンスが格段に向上します。

プロジェクトで GUID をデータベースの主キーにするなら、v7 は v4 より良い選択です。

「GUID は重複しない」——でもネットのあの話、実は計算が間違っている

GUID の一意性の話になるといつも、「万が一重複したらどうするの?」という質問が出ます。

ネット上ではこういう説が流れています:「v4 GUID の衝突確率は無視できるほど小さく、毎秒 10 億個生成して 10 億年続けても重複しない。」なんだか安心できますね。

でも、この主張は数学的に間違っています。

どこが間違っているのか?誕生日パラドックス

これは誕生日パラドックスという古典的な直感の罠に陥っています。

聞いたことがあるかもしれません:一部屋に何人集まれば、「誰か二人が同じ誕生日」になる確率が 50% を超えるでしょうか?直感では、365 日あるなら 180 人くらい必要だろうと思いますよね。

実際には、23 人で十分です。

理由は、ある特定の日と「特定の誰か」が一致するかどうかを見ているのではなく、「全員のペアのいずれか」が一致するかどうかを見ているからです。人数が増えると、ペアの組み合わせ数が急激に増加します。

GUID も同じ道理です。「ある GUID が別の GUID と偶然一致するか」ではなく、「すでに生成されたすべての GUID の中で、任意の 2 つが衝突するか」を見なければなりません。組み合わせ数は総量に対して二次関数的に増加し、直感が告げるよりもはるかに速く増えます。

本当の衝突タイムライン

毎秒 10 億個のペースで途切れることなく生成し続けると仮定して、誕生日パラドックスの公式で計算し直してみましょう:

  • 10 年:衝突確率は約 1%
  • 33 年:衝突確率は約 10%
  • 86 年:衝突確率は約 50%

10 億年となると、衝突回数はもう数えきれません。

それでも安心して使えるのか?

もちろん使えます。上記の前提は「毎秒 10 億個、途切れることなく」です——現実には、そんなペースで生成するアプリケーションは存在しません。

システムの全ライフサイクルを通じて合計 100 兆個の GUID を生成したとして(これは極端に誇張された天文学的な数です)、衝突確率は10 億分の 1にしかなりません。

安心して使いましょう。

日常の開発における GUID の悩み

原理を理解したところで、現実に戻りましょう。開発者が日常的に GUID と付き合う上での本当の悩みは、「重複するかどうか」ではなく、次のようなことにあります:

生成が面倒

Windows 標準の guidgen.exe は一度に 1 つしか生成できません。ターミナルなら?PowerShell で [guid]::NewGuid() は使えます。でも、テストデータ用に 50 個一度に生成したい場合は?スクリプトを書くしかありません。

フォーマットが多様すぎる

同じ GUID でも、言語や場面によって見た目が全く違います:

6B29FC40-CA47-1067-B31D-00DD010662DA          // 標準フォーマット
6B29FC40CA471067B31D00DD010662DA              // ハイフンなし
{6B29FC40-CA47-1067-B31D-00DD010662DA}        // 中括弧(C#/COM)
urn:uuid:6B29FC40-CA47-1067-B31D-00DD010662DA // URN
aKXwnELGRYeysdADQClibto=                      // Base64

ログから GUID をコピーして、C コードの DEFINE_GUID マクロ形式に変換したい?手動で直すしかありません。

テキストからの抽出が面倒

ログファイルに数十個の GUID が散らばっていて、全部見つけたい。目で探す?それとも正規表現を書く?

regex
[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}

使えますが、毎回調べないと正しく書けません。

QuickGUID で解決

こうした悩みは、1 つのツールですべて解決できます。QuickGUID は Windows ネイティブの GUID ツールボックスです:

  • 一括生成:v4 または v7 を最大 1,000 個まで一度に生成
  • 10 種類以上のフォーマットをリアルタイム変換:標準、ハイフンなし、中括弧、Base64、C バイト配列、DEFINE_GUID マクロ……すべてリアルタイムプレビュー
  • スマート抽出:ログやソースコードを貼り付けるだけで、すべての GUID を自動認識して一括変換
  • リアルタイムデコレーター:引用符、サフィックス、大文字/小文字をグローバルに切り替え、コピーしてそのまま使える

完全無料、100% オフライン。

おわりに

GUID はソフトウェア開発において最も目立たないが、最も信頼できるインフラの一つです。128 ビットで、中央の調整もネットワーク接続も不要に、世界中で一意性を保証できる。この設計が誕生してから 30 年以上経ちますが、今でも分散システムにおける識別子のベストプラクティスの一つです。

この記事で、GUID の背後にある「なぜ」が少しでも理解できたなら幸いです。