C#でGUIDはどのように生成されますか?
元の質問:
Guidはどのように識別子を生成していますか?次のコードを使用するとどのように出力されますかGuid g = Guid.NewGuid();
出力が数字とレッターの組み合わせになるのか、数字だけになるのか?
.Net System.Guid
は128ビット整数(16バイト)です。数字や文字はそれとは何の関係もありません。 ToString()メソッドを使用して、0〜9の数字とA〜Fの文字(16進値を表す)を含む、Guidのさまざまな「人間が読める」バージョンを表示できますが、出力方法は自由です。
GUIDがどのように生成されるか、特にGUIDの部分文字列が一意であることが保証されていない理由を説明する本当に良い記事があります ここ 。
基本的に、a GUIDは、次の組み合わせを使用して生成されます
ただし、これはGUIDの生成に使用される特定のアルゴリズムの1つにすぎません。 (.Netフレームワークで使用されているものだと思いますが)、ではありません 。Netフレームワークで使用されるもの
アルゴリズムは Globally unique identifier としてここに文書化されています
RFCに記載されているように、「ランダム16バイト」の他にGUIDの他の形式もあります。一部のMicrosoft製品(SQL Serverなど)は、オプションでこれらの「シーケンシャルGUID」を生成できます。 「システム内の最初のネットワークカードのMACアドレス+システム時間に基づいて増加するカウンター」の組み合わせ。
これらの「シーケンシャルGUID」には、クラスター化インデックスを持つデータベースの主キーとして使用される場合、常にデータベーステーブルの「末尾」に新しいレコードを追加するという素晴らしいプロパティがあります。これにより、データベースインデックスの断片化とページ分割を防ぐことができます。
ランダムなGUIDがクラスター化インデックスのあるデータベースの主キーとして使用される場合、新しいレコードが物理割り当ての観点からテーブルの「中央」にランダムに挿入されます。
シーケンシャルGUIDを使用すると、複数のシステムで独立してGUIDを生成でき、衝突が発生しないことを確信できます(各システムに「範囲」または異なるシードと増分を割り当てずに、シーケンシャル整数を主キーとして使用しても取得できないプロパティ。これは、大規模な分散アプリケーションにおける管理上の悪夢です)。
GUIDのビットは次のように分類されます:
合計128ビット。
Wikipedia および [〜#〜] msdn [〜#〜] の詳細。
要するに、a GUIDはランダムな128ビット整数ですが、読みやすいように16進数を使用してフォーマットします(これは8-4-4-4-12フォーマットです。生成方法については、リンクされているWikipediaの記事を参照してください。