GUIDは100%一意ですか?
複数のスレッドにわたって一意のままですか?
GUIDは100%一意ですか?
複数のスレッドにわたって一意のままですか?
回答:
生成された各GUIDは一意であることが保証されていませんが、一意のキーの総数(2 128または3.4×10 38)は非常に多いため、同じ番号が2回生成される確率は非常に小さくなります。たとえば、約5×10 22 個の星を含む観測可能な宇宙を考えてみましょう。すべてのスターは6.8×10 15の普遍的に一意のGUIDを持つことができます。
ウィキペディアから。
これらは、GUIDの作成方法(.NETの場合)と、適切な状況で同じGUIDを取得する方法に関する優れた記事です。
https://ericlippert.com/2012/04/24/guid-guide-part-one/
https://ericlippert.com/2012/04/30/guid-guide-part-two/
https://ericlippert.com/2012/05/07/guid-guide-part-three/
2^128
書き出されたものはだいたい次のとおりであることを知りたいでしょう34,028,236,692,093,846,346,337,460,743,177,000,000
。統計的に、毎秒1000個のGUIDを計算した場合でも、複製を取得するには数兆年かかります。
同じGUID値が怖い場合は、それらの2つを隣同士にしてください。
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
あなたが偏執的すぎる場合は、3つ入れてください。
999999999
あなたのフォームで9が9を超えると、Paranoiaがブラウザをa-splodeすると思います。
簡単な答えはイエスです。
Raymond Chen wrote a great article on GUIDs and why substrings of GUIDs are not guaranteed unique. The article goes in to some depth as to the way GUIDs are generated and the data they use to ensure uniqueness, which should go to some length in explaining why they are :-)
余談ですが、私はWindows XPでボリュームGUIDをいじっていました。これは、3つのディスクと14のボリュームを持つ非常に不明瞭なパーティションレイアウトです。
\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
| | | | |
| | | | +-- 6f = o
| | | +---- 69 = i
| | +------ 72 = r
| +-------- 61 = a
+---------- 6d = m
GUIDが非常に似ているということではなく、すべてのGUIDに「mario」という文字列が含まれているという事実です。それは偶然ですか、それとも背後に説明がありますか?
ここで、GUIDのパート4をグーグル検索すると、ボリュームGUIDで約125.000ヒットが見つかりました。
結論:ボリュームGUIDに関しては、他のGUIDほど一意ではありません。
msiexec
、Office プログラムのすべてのMSI GUIDが一覧表示されます。それらはすべて綴り0FF1CE
ます。Microsoftはかなり...緩い... GUIDを生成する方法の解釈を持っているようです;)
0FF1CE
GUIDはRFC-4122の「NCS下位互換性」セクションに該当しますが、Microsoftがこれらの値のNCSルールに従っていることはほとんどありません。
それは起こらないはずです。ただし、.NETに大きな負荷がかかっている場合は、GUIDが重複する可能性があります。2つの異なるSQLサーバーを使用する2つの異なるWebサーバーがあります。データをマージしに行ったところ、1500万のGUIDと7つの複製が見つかりました。
Guid.NewGuid
常にv4 GUIDを生成します(常に生成します)。ティムは非常に貧弱なエントロピー源を持っていたに違いありません。
はい、GUIDは常に一意である必要があります。それは、ハードウェアと時間の両方に基づいており、さらにそれが一意であることを確認するためにいくつかの追加ビットがあります。理論的には2つの同じものになる可能性はありますが、実際のシナリオでは非常にまれです。
以下は、Guidsに関するRaymond Chenの優れた記事です。
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Eric LippertがGUIDに関する非常に興味深い一連の記事を書いています。
そこオーダー2台の上にある30の世界におけるパーソナルコンピュータ(およびハンドヘルドデバイスまたはコンピューティングパワーの多かれ少なかれ同じレベルを持つ非PCコンピューティングデバイスの当然の多くが、それらを無視することができます)。世界中のすべてのPCにGUIDを生成するタスクを任せたとしましょう。それぞれが生成することができれば、2つの、言う20秒続いた後にのみ、約2あたりのGUID 72 -秒150000000000000年 -あなたが持っているでしょう、非常に高いあなたの特定のGUIDとの衝突が発生する可能性を。そして衝突の確率はたった30兆年後にかなり良くなります。
理論的には、いいえ、それらは一意ではありません。同じGUIDを何度も生成することが可能です。ただし、それが発生する可能性は非常に低いため、それらが固有のものであると想定できます。
以前に読んだことがありますが、可能性が非常に低いため、サーバーが自発的に燃焼したり、コード内の他のバグなど、他のことについて本当に強調する必要があります。つまり、それはユニークだと仮定して「キャッチ」重複する任意のコードでビルドしていない-発生する可能性が高い何かに自分の時間を過ごす(つまり、何も他を)。
私は、 GUIDの有用性をブログの読者(非技術系の家族)に説明しようとしました。そこから(Wikipedia経由で)、GUIDが重複して生成される可能性:
それが発生する確率の実際の数学については言及されていないようです。
最初に、128ビットスペース全体を使用できると仮定します(Guid v4は122ビットのみを使用します)。
n
ピックで重複が発生しない一般的な確率は次のとおりです。
(1-1 / 2 128)(1-2 / 2 128)...(1-(n-1)/ 2 128)
2 128はに比べてはるかに大きいためn
、これを次のように概算できます。
(1-1 / 2 128)n(n-1)/ 2
そして、私たちはn
0よりはるかに大きいと仮定できるので、それを次のように概算できます。
(1-1 / 2 128)n ^ 2/2
これを「許容可能な」確率と見なすことができます。1%としましょう。
(1-1 / 2 128)n ^ 2/2 = 0.01
私たちが解決しn
て得るもの:
n = sqrt(2 * log 0.01 / log(1-1 / 2 128))
どのWolfram Alphaが5.598318×10 19になるか
その数を概観するために、それぞれが4コアCPUを備え、4 GHzを実行し、Guidを生成するために10000サイクルを費やし、他には何もしない10000台のマシンを取り上げます。複製が生成されるまでには、111年ほどかかります。
http://www.guidgenerator.com/online-guid-generator.aspxから
GUIDとは何ですか?
GUID(またはUUID)は、 'Globally Unique Identifier'(または 'Universally Unique Identifier')の頭字語です。リソースの識別に使用される128ビットの整数です。GUIDという用語は通常、Microsoftテクノロジを使用する開発者によって使用されますが、UUIDは他のあらゆる場所で使用されます。
GUIDはどの程度一意ですか?
128ビットは十分な大きさであり、生成アルゴリズムは十分ユニークであり、1秒間に1,000,000,000 GUIDが1年間生成された場合、重複の確率は50%にすぎません。または、地球上のすべての人間が600,000,000のGUIDを生成した場合、重複する確率は50%にすぎません。
GUIDの重複が発生しました。
私はNeat Receiptsデスクトップスキャナーを使用しており、専用のデータベースソフトウェアが付属しています。ソフトウェアにはクラウドへの同期機能があり、同期時にエラーが発生し続けました。丸太をじっくり見てみると、素晴らしいラインがわかりました。
"エラー":[{"コード":1、 "メッセージ": "作成者_guid:はすでに使用されています"、 "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}
私は少し信じられませんでしたが、確かに、ローカルのneatworksデータベースにアクセスする方法を見つけ、そのGUIDを含むレコードを削除すると、エラーは発生しなくなりました。
だから、事例証拠であなたの質問に答えるために、いいえ。複製が可能です。しかし、それが起こった理由は偶然によるのではなく、標準的な慣習が何らかの形で守られていないためである可能性があります。(私はそれほど幸運ではありません)しかし、私は確かに言うことはできません。それは私のソフトウェアではありません。
カスタマーサポートは非常に丁寧で親切でしたが、電話で3時間以上経過しても解決策が見つからなかったため、この問題に遭遇したことはありませんでした。(FWIW、私はニートに非常に感銘を受けました、そしてこのグリッチは、いらいらしたとしても、彼らの製品に対する私の意見を変えませんでした。)
システムクロックが適切に設定されており、ラップアラウンドしていない場合、およびNICに独自のMACがあり(つまり、カスタムMACを設定していない)、NICベンダーがMACをリサイクルしていない場合(これは想定されていません)ただし、これが発生することがわかっている場合)、およびシステムのGUID生成機能が適切に実装されている場合、システムが重複したGUIDを生成することはありません。
GUIDを生成している地球上のすべての人がこれらのルールに従う場合、GUIDはグローバルに一意になります。
実際には、ルールを破る人の数は少なく、GUIDが「エスケープ」する可能性は低いです。競合は統計的にありそうもありません。
GUIDは100%一意ですか?
生成にはいくつかの方法があるため、保証されません。ただし、同一の2つのGUIDを作成する可能性を計算すると、アイデアを得ることができます。GUIDは128ビットであるため、2つの128の異なるGUID があります。これは、既知の宇宙にある星よりもはるかに多い数です。詳細については、ウィキペディアの記事をご覧ください。
より一般的な意味で、これは「誕生日問題」または「誕生日パラドックス」として知られています。ウィキペディアの概要は、 ウィキペディア-誕生日問題
非常に大まかに言えば、プールのサイズの平方根は、重複の可能性が50%になると予想できる場合のおおよその概算です。この記事には、プールサイズの確率表と、2 ^ 128の行を含むさまざまな確率が含まれています。したがって、衝突の確率が1%の場合、ランダムに2.6 * 10 ^ 18の128ビットの数値を選択することになります。50%の確率では2.2 * 10 ^ 19のピックが必要ですが、SQRT(2 ^ 128)は1.8 * 10 ^ 19です。
もちろん、これは真にランダムなプロセスの理想的なケースにすぎません。他の人が述べたように、多くはそのランダムな側面に乗っています-ジェネレータとシードはどれほど優れているのですか?このプロセスを支援するハードウェアサポートがあれば、何でもスプーフィングまたは仮想化できることを除いて、より弾力性が高くなるとよいでしょう。これが、MACアドレス/タイムスタンプが組み込まれなくなった理由かもしれないと思います。
より良い結果を得るための最良の方法は、GUIDにタイムスタンプを追加することです(一意であることを確認するためです)
Guid.NewGuid().ToString() + DateTime.Now.ToString();
GUIDアルゴリズムは通常、基本的に疑似ランダム文字列であるv4 GUID仕様に従って実装されます。悲しいことに、これらは「一意ではない可能性が高い」のカテゴリに分類されますはWikipedia(なぜ多くの人がこのビットを無視するのかはわかりません)。「...他のGUIDバージョンには、一意性の保証から、一意性のプロパティや確率までさまざまです。おそらく非一意性に」
V8のJavaScriptの疑似ランダムプロパティ Math.random()
一意性が非常に低く、衝突は数千回の反復後に発生することがよくありますが、原因はV8だけではありません。PHPとRubyの両方のv4 GUID実装を使用した実際のGUIDの衝突を見てきました。
複数のクライアントやサーバーのクラスター間でID生成をスケーリングすることがますます一般的になっているため、エントロピーは大きな打撃を与えます-IDの生成に同じランダムシードが使用される可能性がエスカレートします(時間はランダムシードとしてよく使用されます)疑似ランダムジェネレータでは)、GUIDの衝突は「一意でない可能性が高い」から「多くの問題を引き起こす可能性が高い」にエスカレートします。
この問題を解決するために、私は安全にスケーリングできるIDアルゴリズムを作成し、衝突に対してより良い保証をすることに着手しました。これは、タイムスタンプ、メモリ内のクライアントカウンター、クライアントのフィンガープリント、ランダムな文字を使用して行われます。複数のホスト間でスケーリングしても、要因の組み合わせにより、特に衝突に強い追加の複雑さが作成されます。
マルチスレッド/マルチプロセスの単体テスト中にGUIDが一意でないことを経験しました(そうですか?)。他のすべてのティンが等しい場合、疑似ランダムジェネレーターの同一のシード(またはシードの欠如)に関係していると思います。一意のファイル名を生成するために使用していました。OSの方がはるかに優れていることがわかりました:)
GUIDが100%一意であるかどうかを尋ねます。これは、一意である必要があるGUIDの数によって異なります。GUIDの数が無限に近づくと、GUIDが重複する確率は100%に近づきます。
「GUIDは100%一意ですか?」という答え 単に"いいえ"です。
GUIDの100%の一意性が必要な場合は、次のようにします。
最も難しいのは、複製されたGuidを生成することではありません。
最も難しい部分は、実際に複製されているかどうかを確認するために、生成されたものをすべて格納するデータベースを設計することです。
WIKIから:
たとえば、少なくとも1回の衝突の50%の確率を持つために生成する必要があるランダムなバージョン4 UUIDの数は、次のように計算されて2.71千兆です。
この数は、約85年間、1秒あたり10億のUUIDを生成することに相当します。UUIDあたり16バイトのこの多数のUUIDを含むファイルは、約45エクサバイトであり、現在存在する最大のデータベースよりも何倍も大きいです。数百ペタバイトのオーダー
GUIDはGlobal Unique Identifierの略です
簡単に言うと:(手がかりが名前にある)
詳細:GUIDは一意になるように設計されています。それらは、コンピューターのクロックとコンピューター自体に基づいてランダムな方法を使用して計算されます。同じマシン上で同じミリ秒に多くのGUIDを作成している場合、それらは一致する可能性がありますが、ほとんどすべての通常の操作で一意と見なされます。