【C#】ユニークな識別子(GUID)を生成する

目次

概要

データベースの主キー、一時ファイル名、セッション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)を返します。
  • 特定の形式への変換
    • データベースに保存する際は、そのまま Guid 型として渡すのが一般的ですが、テキスト列として保存する場合は “D”(標準)か “N”(短縮)がよく選ばれます。

注意点

  1. ランダム性(バージョン4)
    • Guid.NewGuid() は通常、バージョン4(乱数ベース)のGUIDを生成します。衝突確率は天文学的に低いですが、完全なユニーク(数理的な保証)ではありません。
  2. データベースのインデックス
    • ランダムな値を主キー(特にクラスタ化インデックス)に使用すると、データの挿入位置がバラバラになり、インデックスの断片化(フラグメンテーション)を引き起こしてパフォーマンスが低下することがあります。SQL Server等では NewSequentialId のようなシーケンシャルなGUIDの使用が推奨される場合があります。
  3. 予測可能性
    • セキュリティトークンやパスワードリセットのURLに使用する場合、Guid.NewGuid() は便利ですが、暗号論的に安全な乱数生成器(RandomNumberGenerator)を使用した実装の方がより堅牢です。

応用

文字列から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利用: インデックス性能への影響を考慮して採用を検討してください。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次