ネットと StackOverflow には、GUID に関するかなりの情報があります。確かに、独自性についての無限の質問。これは2^128 の一意性に関する質問ではありません。
私の質問は、最初のセクション、具体的には GUID の最初の4 バイトが .NET でどれだけランダムかを判断することです。調査によると、これはタイムスタンプの最下位 32 ビットであると考えられています。しかし、タイムスタンプはどのように変換されるのでしょうか? これはどのくらいランダムですか?
最初のセクションが .NET によってどのように構築され、本当に 4 バイトに均等に分散されているかを知っている人はいますか?
最初の 32 ビットを構成するためにタイムスタンプはどのように使用されますか?
時計の精度はどのように影響しますか?
Microsoft は、最初の 4 バイトがランダムになる傾向があるかどうかを確認するために何らかの試みを行いましたか?
どうして:大量の Guid の使用には、最初の 4 バイトに含まれる適切なランダム GUID の 2 つの主なビジネス ケースがあります。新しい GUID ごとに均等に分散している場合は、必要なパーティションの数に基づいて、最初の 1、2、3、または 4 バイトに基づいてテーブル パーティション分割を使用できます。最初の 2 バイトをパーティション キーとして使用する 128 のパーティションで、1 日に 1,000 万回の挿入がある 20 億行のテーブルを見てきました。注 DB2 では、キーの最初の部分を使用する必要がありました。DB2 DBA を引用します。これにより、DB のスループットが大幅に向上しました。2 つ目の用途は、バッチ ジョブの並列キー割り当てです。バッチ タスクとして約 N 行あることがわかっている場合は、キー範囲を並列ジョブに割り当てることができます。同種分割を行わない場合、ディスパッチャは最初に各ジョブの from キーと to キーを計算する必要があります。それが、作業をディスパッチするためだけに 1 億を読み取り、それらをメモリ内で管理することを意味する場合、最初の x 分は、ジョブのディスパッチに失われます。私が見た例では、約15分でした。したがって、均等に分散された GUId を使用し、必要とする 2 つの優れた理由があります。
SAP バンキング システムは、GUID の最初のセクションでランダム性の欠如を解決するために、カスタム GUID ルーチンを実際に導入しました。SAP バンキング システムにアクセスできる場合、関数は BANK_DISTRIBUTED_ID_CREATE です。コード内のコメントは、なぜそうしたのかを説明しています。SAP サポートにアクセスできる人向けのメモ 496904 には、GUID を修正する必要がある理由が説明されています。
カスタム ルーチンの前は、AIX の GUID に明確な偏りがありました。C++ カーネル。ユニーク はい、しかしランダム 、特に最初のセクションは明らかにそうではありません。
更新: 調査するプログラムを作成することにしたので: Windows XP の .net 4、Dell Intel Core 2 Duo。
興味がある場合に備えて、テストプログラムの結果を含めました。を使用して生成されたガイド
var G = Guid.NewGuid();
結果は SAMPLE 100,000,000 GUID で問題ないように見えます (より大きなセットがまだ実行中です)。
Byte 0: with Value 6A was least frequent : 389140 times
Byte 0: with Value 58 was most frequent : 392241 times
Byte 1: with Value 25 was least frequent : 388905 times
Byte 1: with Value B3 was most frequent : 392552 times
Byte 2: with Value D2 was least frequent : 389114 times
Byte 2: with Value CC was most frequent : 391984 times
Byte 3: with Value 66 was least frequent : 388744 times
Byte 3: with Value 16 was most frequent : 392838 times
編集:コメントに基づいて追加された背景調査
AIX システムで GUID のサンプルを見たことがあります。すでに20億を超えています。それらは均等に広がっていません。2 バイトに顕著なスキューがあります。その結果、同種の GUID を生成するための特別なルーチンが導入されました。.netに同様のスキューがあるかどうか疑問に思っていました