web-dev-qa-db-ja.com

C#はどのようにGUIDを生成しますか?

C#でGUIDはどのように生成されますか?

33
Developer404

元の質問:

Guidはどのように識別子を生成していますか?次のコードを使用するとどのように出力されますかGuid g = Guid.NewGuid();

出力が数字とレッターの組み合わせになるのか、数字だけになるのか?

.Net System.Guidは128ビット整数(16バイト)です。数字や文字はそれとは何の関係もありません。 ToString()メソッドを使用して、0〜9の数字とA〜Fの文字(16進値を表す)を含む、Guidのさまざまな「人間が読める」バージョンを表示できますが、出力方法は自由です。

10
Dave Mateer

GUIDがどのように生成されるか、特にGUIDの部分文字列が一意であることが保証されていない理由を説明する本当に良い記事があります ここ

基本的に、a GUIDは、次の組み合わせを使用して生成されます

  • GUIDの生成に使用されるマシンのMACアドレス(したがって、MACアドレスが再利用されない限り、異なるマシンで生成されるGUIDは一意です)
  • Timestamp(したがって、同じマシン上で異なる時間に生成されたGUIDは一意です)
  • 追加の「緊急一意化ビット」(これらは、同じマシン上でほぼ同時に生成されたGUIDが一意であることを確認するために使用されます)
  • アルゴリズムの識別子(異なるアルゴリズムで生成されたGUIDが一意になるように)

ただし、これはGUIDの生成に使用される特定のアルゴリズムの1つにすぎません。 (.Netフレームワークで使用されているものだと思いますが)、ではありません 。Netフレームワークで使用されるもの

45
Justin

アルゴリズムは Globally unique identifier としてここに文書化されています

13
David

RFCに記載されているように、「ランダム16バイト」の他にGUIDの他の形式もあります。一部のMicrosoft製品(SQL Serverなど)は、オプションでこれらの「シーケンシャルGUID」を生成できます。 「システム内の最初のネットワークカードのMACアドレス+システム時間に基づいて増加するカウンター」の組み合わせ。

これらの「シーケンシャルGUID」には、クラスター化インデックスを持つデータベースの主キーとして使用される場合、常にデータベーステーブルの「末尾」に新しいレコードを追加するという素晴らしいプロパティがあります。これにより、データベースインデックスの断片化とページ分割を防ぐことができます。

ランダムなGUIDがクラスター化インデックスのあるデータベースの主キーとして使用される場合、新しいレコードが物理割り当ての観点からテーブルの「中央」にランダムに挿入されます。

シーケンシャルGUIDを使用すると、複数のシステムで独立してGUIDを生成でき、衝突が発生しないことを確信できます(各システムに「範囲」または異なるシードと増分を割り当てずに、シーケンシャル整数を主キーとして使用しても取得できないプロパティ。これは、大規模な分散アプリケーションにおける管理上の悪夢です)。

1
rmalayter

GUIDのビットは次のように分類されます:

  • 60ビットのタイムスタンプ
  • 48ビットのコンピューター識別子
  • 14ビットの一意化子
  • 6ビット固定

合計128ビット。

0
Prince Prasad

Wikipedia および [〜#〜] msdn [〜#〜] の詳細。

要するに、a GUIDはランダムな128ビット整数ですが、読みやすいように16進数を使用してフォーマットします(これは8-4-4-4-12フォーマットです。生成方法については、リンクされているWikipediaの記事を参照してください。

0
jason