web-dev-qa-db-ja.com

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

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

ボーナス質問

一意性をテストする最適な方法GUID?ブルームフィルターかもしれませんか?

107
Tom Savage

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

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

そこには膨大な数のGUIDがあります。ダグラス・アダムスのヒッチハイカーの銀河へのガイドを引用するには

「スペース」とは、「大きい。本当に大きい。あなたは、それがどれほど巨大であるかを信じられないだろう。化学者への道のりは長い道のりだと思うかもしれないが、それはただの宇宙へのピーナッツだ」 、聞いて…」

そして 約7×1022 宇宙の星 、および2のすぐ下128 GUID、その後約4.86×1015—ほぼ5兆—すべての星のGUID。それらの星のすべてが私たちのような繁栄した人口を持つ世界を持っていた場合、すべての星の周りに、これまでに住んでいたすべての人間または外国人 45万を超えるGUIDを使用する権利があります。宇宙のすべての星の歴史のすべての人のために。 GUIDスペースは、宇宙全体のサイズと同じレベルの巨大さです。あなたはnot心配する必要があります。

Edit 2:これについて考えると:わあ。myselfこれが何を意味するのか気づかなかった。 GUIDスペースは理解できないほど巨大です。私はそれをsort敬の念を抱いています。)

332

簡単な答え:実際には、はい。

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

いくつかの代表的な衝突確率を計算しました。 Wikipediaの記事 で指定されている122ビットUUIDを使用すると、少なくとも2.71492e18 UUID。 10 ^ 19 UUIDの場合、確率は0.999918です。 10 ^ 17 UUIDの場合、0.000939953。

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

毎秒10億UUIDを生成する場合、 約36年かかります 衝突確率10%を取得します。

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

38

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

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

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

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

8
Mark Ransom

一般に、はい、それは仮定するのが安全です。

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

もちろん、それは良いGUIDジェネレーターを想定しています。したがって、問題は、あなたがGUID=独自のテストがありますか?

5
Haacked

衝突は可能ですが、ほとんどありません。 (Math here 。)実際に区別できると仮定しても安全です。

0
VeeArr
0
Brad