目次
概要
データベースの主キー、一時ファイル名、セッションIDなど、重複しない一意な値が必要な場合に利用される GUID (Globally Unique Identifier) を生成する方法です。 .NET標準の Guid.NewGuid() メソッドを使用することで、バージョン4(ランダムベース)のGUIDを簡単に作成できます。
仕様(入出力)
- 入力
- なし
- 出力
- ランダムに生成された
System.Guid構造体
- ランダムに生成された
- 文字列化の形式
- 引数なし(”D”): ハイフン区切りの32桁(標準)
- “N”: ハイフンなしの32桁
- “B”: 中括弧
{}で囲む - “P”: 丸括弧
()で囲む - “X”: 16進数構造体表現
基本の使い方
Guid.NewGuid() を呼び出し、ToString() で文字列として利用します。
// 新しいGUIDを生成
Guid myId = Guid.NewGuid();
// 文字列として表示 (例: "a9c3b8..." 形式)
Console.WriteLine(myId.ToString());
コード全文
GUIDを生成し、ToString の引数(書式指定子)によって出力形式がどのように変化するかを確認するコンソールアプリケーションです。
using System;
class Program
{
static void Main()
{
// 1. 新しいGUIDを生成(毎回異なる値になります)
Guid guid = Guid.NewGuid();
Console.WriteLine("=== GUID Generation ===");
// 2. 様々なフォーマットでの出力
// 引数なし (Dと同じ) : 標準的なハイフン区切り
Console.WriteLine($"Default: {guid.ToString()}");
// "D" : 32桁 + ハイフン (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
Console.WriteLine($"Format D: {guid.ToString("D")}");
// "N" : 32桁のみ (ハイフンなし)
// 用途: ファイル名やURLパラメータなど
Console.WriteLine($"Format N: {guid.ToString("N")}");
// "B" : 中括弧付き
// 用途: レジストリキーなど
Console.WriteLine($"Format B: {guid.ToString("B")}");
// "P" : 丸括弧付き
Console.WriteLine($"Format P: {guid.ToString("P")}");
// "X" : 16進数の構造体表現 ({0x...,0x...,...})
// 用途: コード内での定数宣言など
Console.WriteLine($"Format X: {guid.ToString("X")}");
}
}
実行結果例
=== GUID Generation ===
Default: 5f3d7b2a-9e1c-4b8d-a5f2-123456789abc
Format D: 5f3d7b2a-9e1c-4b8d-a5f2-123456789abc
Format N: 5f3d7b2a9e1c4b8da5f2123456789abc
Format B: {5f3d7b2a-9e1c-4b8d-a5f2-123456789abc}
Format P: (5f3d7b2a-9e1c-4b8d-a5f2-123456789abc)
Format X: {0x5f3d7b2a,0x9e1c,0x4b8d,{0xa5,0xf2,0x12,0x34,0x56,0x78,0x9a,0xbc}}
カスタムポイント
- 空のGUID
- 初期値や「ID未設定」を表す場合、
Guid.NewGuid()ではなくGuid.Emptyを使用します。これはオールゼロのGUID(00000000-0000-0000-0000-000000000000)を返します。
- 初期値や「ID未設定」を表す場合、
- 特定の形式への変換
- データベースに保存する際は、そのまま
Guid型として渡すのが一般的ですが、テキスト列として保存する場合は “D”(標準)か “N”(短縮)がよく選ばれます。
- データベースに保存する際は、そのまま
注意点
- ランダム性(バージョン4)
Guid.NewGuid()は通常、バージョン4(乱数ベース)のGUIDを生成します。衝突確率は天文学的に低いですが、完全なユニーク(数理的な保証)ではありません。
- データベースのインデックス
- ランダムな値を主キー(特にクラスタ化インデックス)に使用すると、データの挿入位置がバラバラになり、インデックスの断片化(フラグメンテーション)を引き起こしてパフォーマンスが低下することがあります。SQL Server等では
NewSequentialIdのようなシーケンシャルなGUIDの使用が推奨される場合があります。
- ランダムな値を主キー(特にクラスタ化インデックス)に使用すると、データの挿入位置がバラバラになり、インデックスの断片化(フラグメンテーション)を引き起こしてパフォーマンスが低下することがあります。SQL Server等では
- 予測可能性
- セキュリティトークンやパスワードリセットのURLに使用する場合、
Guid.NewGuid()は便利ですが、暗号論的に安全な乱数生成器(RandomNumberGenerator)を使用した実装の方がより堅牢です。
- セキュリティトークンやパスワードリセットのURLに使用する場合、
応用
文字列からGUIDへの復元
外部から受け取ったID文字列を Guid 型に変換する例です。
string inputId = "5f3d7b2a-9e1c-4b8d-a5f2-123456789abc";
if (Guid.TryParse(inputId, out Guid result))
{
Console.WriteLine($"変換成功: {result}");
}
else
{
Console.WriteLine("不正なGUIDフォーマットです。");
}
まとめ
Guid.NewGuid() は、分散システムにおける一意なID生成の標準的な手段です。
- “D”形式: 最も一般的で可読性が高い。
- “N”形式: URLやファイル名など、記号を避けたい場合に最適。
- DB利用: インデックス性能への影響を考慮して採用を検討してください。
