GUIDが常に一意であると想定しても安全ですか?


123

衝突の可能性はわずかにあることはわかっていますが、たとえば1000のGUIDのバッチを生成した場合、それらをすべて一意であると想定して、それぞれのテストを保存しても安全でしょうか?

ボーナス質問

GUIDの一意性をテストする最適な方法は?ブルームフィルターかな?



29
私たち全員がこのサイトのリロードボタンをマッシュし続けているのではない場合:wasteaguid.info
mipadi

12
私はすべてのバグをGUIDの衝突のせいにしている。いつか起こらなければならない?
Michael

8
格子縞模様の素敵な色のサメが空から落ちてコンピューターを砕いてしまう可能性がはるかに高いため、予防策を講じることで、全体的なリスク低減の一環としてリソースをより適切に割り当てることができます。予定。
David Gladfelter、2010年

4
@mipadi:素晴らしいリンク!どこかの開発者が「Guuuuys!GUIDの浪費をやめなさい!GUID が必要だ!」
FrustratedWithFormsDesigner 2010年

回答:


360

はい、できます。GUIDは128ビットの長さなので、衝突の可能性は確かにわずかですが、「分」という言葉は十分に強力ではありません。GUID非常に多く、ランダムに数兆個生成した場合でも、衝突が1回発生するよりも、隕石に衝突する可能性が高くなります(Wikipediaから)。そして、それらをランダムに生成していなくても、たとえば MACアドレスとタイムスタンプのアルゴリズムを使用している場合、MACアドレスはコンピューター間で一意であり、タイムスタンプはコンピューター上で一意であるため、それらも一意になります。コンピューター。

編集1:ボーナスの質問に答えるために、GUIDのセットの一意性をテストする最適な方法は、GUIDがすべて一意であると仮定することです。どうして?生成しているGUIDの数を考えると、GUIDの衝突の確率は、コンピューターのメモリ内のビットを反転させ、気にかけている「正確な」アルゴリズムによって与えられた答えを台無しにする宇宙線の確率よりも小さいためです。走る。(数学については、このStackOverflowの回答を参照してください。)

そこには非常に多くのGUIDがあります。ダグラスアダムスのヒッチハイカーの銀河ガイドを引用するには

「宇宙」とは、「大きいです。本当に大きいです。それがどれほど巨大で途方もないほど大きいか、あなたは信じられないでしょう。つまり、それは、化学者への道のりの長い道のりだと思うかもしれませんが、それは宇宙へのピーナッツです聞いて…」

また、宇宙には約7×10 22個の星があり、 2 128個の GUIDのすぐ下にあるため、すべての星に約4.86×10 15個(ほぼ5兆兆個)の GUIDがあります。それらの星のすべてに私たちのような人口の多い世界があったとすると、すべての星の周りに、これまでに住んだことのあるすべての人間またはエイリアンは、45,000を超えるGUIDを取得する資格があります。宇宙のすべての星の歴史上のすべての人のために。GUIDスペースは、宇宙全体のサイズと同じレベルの巨大さです。心配する必要ありませ

編集2:これを振り返って:うわー。私はこれが何を意味するのか自分自身に気づいていませんでした。GUIDスペースは理解できないほど大規模です。私はそれに畏敬の念を抱いています。)


1
また、WolframAlphaは、これまでに住んだことのあるすべての人のすべてのセルに対して、36兆のUUIDがあると報告しています。あなたの体にはおよそ10^14細胞があり、1,065億人が生きてきました。または、2.385 * 10^23米国の公的債務の1セントごとのUUID。
new123456 2011

5
数値はまだ高いですが、GUIDの衝突の可能性は2 ^ 64 GUIDで50%以上です。
NullUserException

1
2 ^ 64 GUIDの場合、これにより、数は宇宙の星あたり1(0.00026)未満に、そしてこれまでに住んだすべての人間またはエイリアンの場合は2 * 10 ^(-15)に削減されます。これにより、これまでに住んだことのあるすべての人間に対して1億7千万を超えるGUIDが許可されます。
12

12
GUIDの衝突は、同じビジネススペースにある場合にのみ問題になることにも注意してください。ソフトウェアのコンポーネントを識別するために使用するGUIDは、独自のアプリケーションのデータベース行で使用するGUIDと同じで、問題を引き起こすことはありません
James Thorpe

1
2 ^ 128のGUIDSがあるという事実は無関係であり、衝突の50%の確率で「まだ良好」ではなく、0.0000001%でさえ良好ではありません
BlackTigerX 2017

40

短い答え:実用的な目的のために、はい。

ただし、誕生日のパラドックスを考慮する必要があります!

いくつかの代表的な衝突確率を計算しました。ウィキペディアの記事で指定されている 122ビットのUUID を使用すると、少なくとも2.71492e18UUID を生成した場合、衝突の確率は1/2になります。10 ^ 19 UUIDの場合、確率は0.999918です。U ^ 10 ^ 17の場合、0.000939953。

比較のためのいくつかの数字はウィキペディアにあります。そのため、生存している各人間、観測可能な宇宙の各銀河、海の各魚、地球上の各アリに安全にUUIDを割り当てることができます。ただし、人類が1年間に生成するトランジスタごとにUUID、地球上の各昆虫、地球上の砂粒、観測可能な宇宙の各星、またはそれ以上の大きさのUUIDを生成する場合、衝突はほぼ確実です。

1秒あたり10億のUUIDを生成する場合、10%の衝突確率を得るには約36年かかります。

最終的には、人類の歴史の中で生成されたUUIDのセット間に衝突が発生する可能性があります。それでも、衝突したUUIDが同じ目的で使用される可能性は非常に低いため、実際には問題はありません。


13
これが宇宙の終わり方です...一部のプログラマーは、GUIDが
メガデス

UUIDはランダムでないデータに基づいているため、36年は-ミリ秒ごとに個別に心配する必要があるだけです。
mjaggard

@mjaggard UUIDはランダムデータに基づいています。とにかく、どんな現代的な種類でも。
Trejkaz

8

衝突の可能性の分析はWikipediaで利用できます:http : //en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

リンクで述べたように、これは乱数ジェネレーターのプロパティの影響を受けます。

GUIDジェネレーターコードにバグがある可能性もあります。可能性は低いですが、数学に基づく衝突の可能性よりも高い可能性があります。

ブルームフィルターが適切な場合があります。GUIDが一意であるかどうかはすぐにわかりますが、衝突を誤って示す可能性があります。バッチを一度にテストする場合の代替方法は、バッチを並べ替えて、連続する各要素を比較することです。


5

一般に、はい、想定しても安全です。

GUIDジェネレーターが本当にランダムである場合、1000 GUID内での衝突の可能性は非常に小さくなります。

もちろん、それは優れたGUIDジェネレータを前提としています。質問は本当に、GUIDを生成するために使用しているツールをどれだけ信頼するかということであり、それは独自のテストを持っていますか?


0

衝突が発生する可能性はありますが、発生する可能性はほとんどありません。(ここでの演算。)それらが実際に異なっていると仮定するのは安全です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.