web-dev-qa-db-ja.com

Guid.NewGuid()の複製を取得する可能性は何ですか?

可能性のある複製:
GUID一意の100%の時間ですか?
GUIDは一意ではないという単純な証明

MSDNで読むことができます:

新しいGuidの値がすべてゼロになるか、他のGuidと等しくなる可能性は非常に低いです。

1秒ごとにファイルを作成するメソッドがあり、ファイル名にGuid.NewGuid()メソッドを使用するとします。同じGuidを取得することは可能ですか?または、ローカルコンピューターは何らかの方法で追跡しますか?チャンスはどれくらい低いですか?

31
Niklas

GUIDを使い果たすことはありません。それらを複製する可能性は非常に低いです:

http://betterexplained.com/articles/the-quick-guide-to-guids/

19
Stefan H

2つの同一のGUIDを取得する可能性は、できるだけ速くGUIDを生成している場合でも、天文学的にはわずかです。 (たとえば、重複を見つけることだけを目的として、毎秒数千のGUIDを生成します。)

もちろん、もしあなたが私の意見が欲しいなら、私たちが銀河を植民地化する時が今から数千年後にあると信じていますどこでも数十億の数字があり、それらのコンピューターのすべてが今日では考えられない速度でGUIDを生成します。そして、それは再び640kのメモリのようになります、DLL地獄、二桁年ミレニアムのバグ、再びそれらすべてが組み合わさった.

GUIDを使用することは、それらが無駄になるので、それらを巨大にしたくないということです。したがって、誰かが無駄にならない程度に小さく、しかも衝突に対する合理的な保証。したがって、それは技術的な妥協です。私たちの世紀では、128ビットは良い妥協のように思えますが、ほぼ数学的な確実性があれば、この妥協があまり良くない別の世紀があります。

39
Mike Nakis

常にいくつかの極小値が重複する可能性がありますが、グローバル一意識別子は次のように意図されています:globallyunique ...システム全体で一意ではなく、Planet Earthで一意です。

理論的には、単一システム上よりも、複数システム間でUUIDを複製する可能性が高いと推測します。 OSは、生成する各GUIDを保存しませんが、おそらく時間ベースのシードデータを使用して、それ自体の衝突を回避します。もちろん、これは実装に依存します。

ああ、そして...チャンスがあります... 3.4 x 10 ^ 38が利用可能です、 ウィキペディア はyou石に襲われる可能性が高いと言います。

また、代替のメソッドを提供します。衝突に対する保護があるため、 Path.GetTempFileName() メソッドを調べる価値があります。ただし、スローする前に65,535個の一意のファイル名しか作成できません。例外以前のファイルが削除されない場合

それ以外は、それほど難しくありません:

string path;

do
{
    path = Guid.NewGuid().ToString(); // Format as needed

} while (File.Exists(path));
10
rfmodulator

衝突に関する情報については、次の質問をお読みください: Are GUID collisions possible?

「1秒ごとに1つのguid」に関しては、生成されたguidは通常時間を考慮に入れるため、同じコンピューターでは、内部クロックの設定を変更しない限り、同じguidを生成する機会はありません

edit:どうやら ウィキペディアのページ guidsについては、guidを作成するときに時間が必須ではないので、使用されるアルゴリズム。 (ウィンドウで)C#を話しているので、実際には [〜#〜] uuid [〜#〜] whichdoesはいくつかのバージョンでタイミングを含みます。

2
samy

GUIDが衝突する前に、間違いなくディスク領域を使い果たすか、ファイルシステムを妨害します。ファイルを正常に作成するときにエラーを処理するだけで問題ありません。

0
tenfour