(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



重複があっては困る状況で利用されるほぼ一意である識別子、GUIDを生成する【C#】


このエントリーをはてなブックマークに追加


はじめに

以前、PlayFabのログイン処理を実装する際に自前でカスタムID、つまりGUIDを生成していました。



その後、C#(.Net)にGUIDの構造体があるという事を知ったので、

今回はそれを試してみようという感じの記事。



なお、Unityの各アセットにあるGUIDを生成しようと話ではないのであしからず。

ちなみにUnityのGUIDは自動生成&設定なので、

metaファイルを削除し、自動再生成させるとGUIDを新しく出来ます。





GUIDとは

そもそもGUIDとはなんぞやという話からですが、

Globally Unique Identifierの略で、Unity等で広く使われている識別子の事です。

GUIDとは、128ビットの整数値からなる、データを一意に識別するために用いられる識別子のことである。

GUIDは、時刻やMACアドレスなどを含むデータとして生成され、重複があっては困る状況で利用される。Windowsではインターフェース識別子やクラス識別子などに利用されている。

GUIDは、絶対的に一意であることが保証されてるわけではないが、実用上はほぼ、世界中に唯一とみなして扱って困難がないといわれている。128ビットの値だと可読性に劣ることもあり、レジストリに記録する際には文字列で表現されている。

なお、GUIDは主にMicrosoftが利用している仕様で、同様の識別子が一般的にはUUID(Universally Unique Identifer)として扱われている。UUIDはRFC 4122で規定されている。


上記の通りパターンが無数にある値の事で、重複があっては困る状況で活用されています。

ただし、重複する可能性も一応あるので、

利用する場合は既に使われていないか判定する処理があると安心です。


GUIDの生成

それでは早速、GUIDの生成ですが、Guid.NewGuidを実行するだけ。

これでGuidの構造体が生成され、中にGUIDが生成&保持されています。

//Guidの構造体生成
Guid guid = Guid.NewGuid();

//生成されたGUIDを確認
Console.WriteLine("GUID : " + guid.ToString());

GUID : eea611e1-ced9-4778-9655-0bd5f54d7e2a


なお、上記の通りToStringで文字列(string)に変換する事が出来ますが、

その時、guid.ToString("N")のように形式を指定する事も可能です。

N 32桁
D 32ハイフンで区切られた数字
B 32は、ハイフンで区切られ、中かっこで囲まれています。
P 32数字はハイフンで区切られ、かっこで囲まれています。
X 4つの16進値が中かっこで囲まれています。4番目の値は、中かっこで囲まれた8つの16進値のサブセットです。


これらの形式を実際に試してみると以下のような感じ。

Console.WriteLine("N : " + guid.ToString("N"));
Console.WriteLine("D : " + guid.ToString("D"));
Console.WriteLine("B : " + guid.ToString("B"));
Console.WriteLine("P : " + guid.ToString("P"));
Console.WriteLine("X : " + guid.ToString("X"));

N : eea611e1ced9477896550bd5f54d7e2a
D : eea611e1-ced9-4778-9655-0bd5f54d7e2a
B : {eea611e1-ced9-4778-9655-0bd5f54d7e2a}
P : (eea611e1-ced9-4778-9655-0bd5f54d7e2a)
X : {0xeea611e1,0xced9,0x4778,{0x96,0x55,0x0b,0xd5,0xf5,0x4d,0x7e,0x2a}}


おそらくハイフンなしの32桁で表示されるToString("N")で使う機会が多いかと思われます。