5


0

重複の危険がある前に、ランダムにGUIDを何回生成できますか? (。ネット)

数学的には、.NETフレームワークの組み込みメソッドを使用して生成された2つのランダムなGUIDでさえも同一であると考えられますが、数百または数千を生成した場合、おおよそそれらが衝突する可能性はどれくらいですか?

世界中のWindowsのコピーごとに1つ生成した場合、それらは衝突しますか?

私が尋ねる理由は、私は多くのオブジェクトを作成し、いくつかを破壊するプログラムを持っているためであり、それらのオブジェクトのいずれか(破壊されたものを含む)が同一のGUIDを持っている可能性について疑問に思っています。

7 Answer


7


〜3E38のGUID値があります。 しかし、バースデーパラドックスは50/50のオッズを削減して、重複するGUIDを1E19まで生成します。 まだ膨大な数ですが、最初に流星の衝撃によってマシンが破壊される確率と比べて非常に有利ですが、システムクロックを使用して重複が発生しないようにします。

多くの大規模でミッションクリティカルなdbaseアプリは、テーブルのプライマリキーとしてGUIDを使用します。 彼らのリードに従うことをheしないでください。


5


GUIDには、以下に基づくコンポーネントがあります

  • 時間(システムクロック)

  • スペース(システムMACアドレス)

  • 乱数

したがって、世界の各マシンに対して同じ時間に1つ生成された場合、それらはMACと乱数によって異なります。

ここに役立つリンクがあります。 http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx


1


GUIDジェネレーターの実装の内部詳細を知らずにチャンスを計算することは困難です。

combinatoricsを使用して数値を取得できますが、これは、組み合わせが同等である可能性が高いと仮定した場合にのみ役立ちます。 したがって、実装に関する統計的な知識がなければ、本当の可能性を伝えるのは難しいでしょう。

Midhatが暗示するものとは対照的に(私が彼を正しく理解していれば)、GUIDの衝突は可能です。 組み込みの乱数ジェネレータは通常、タイムスタンプベースのシードを使用して実装されます。 MACアドレスは、多くの状況で上書きされる可能性があるため、本質的に一意ではありません(少なくとも知っている場合もあります)。 2つのGUIDジェネレーターが同じ入力を取得して、同じ出力を生成する可能性があります。

GUIDは128ビット長であるため、「誰もが使用するのに十分」ですが、衝突が発生しないことを保証するものではありません。


1


過去25年間、RPCとCOM(GUIDとUUIDが重要)で作業し、GUIDが一意の行識別子として使用される分散データベースで作業してきたので、単一のマシンで生成されたか、異なるマシン。 これについては、MSDNからの興味深い別の見解があります。ここでは、ROWIDとしてオブジェクトよりもはるかに長生きしています:http://weblogs.asp.net/wwright/archive/2007/11/04/the-gospel-of-the-guid-and -why-it-matters.aspx


0


本当に長い時間がかかります!


0


Midhatの正しい答えに加えて、http://blogs.msdn.com/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx [Eric Lippert’s Blog]からの引用があります。システムにネットワークカードがインストールされていない(したがって、MACアドレスがない)状況:

_ (ネットワークカードを搭載していないマシンは、「潜在的に一意ではないことがわかっている」範囲にある特別なGUIDを生成します。) _


0


これは、あなたがまったく心配するべきものではありません。 これは、単に作業中の可用性ヒューリスティックです。 それはあなたが知って認識している「リスク」なので、あなたはそれを気にかけたいです。 しかし、数百万倍の可能性が高い他の多くのリスクがありますが、私たちはまだ心配していません。 素晴らしいPro Gitの本はそれを最もよく言っていると思います:

_ プログラミングチームのすべてのメンバーが、同じ夜に無関係のインシデントでオオカミに攻撃されて殺される可能性が高くなります。 _

あなたはそれが遠隔の可能性でさえあるために数百または数十億を生み出さなければならないでしょう。