衝突の可能性はわずかにあることはわかっていますが、たとえば1000のGUIDのバッチを生成した場合、それらをすべて一意であると想定して、それぞれのテストを保存しても安全でしょうか?
ボーナス質問
GUIDの一意性をテストする最適な方法は?ブルームフィルターかな?
衝突の可能性はわずかにあることはわかっていますが、たとえば1000のGUIDのバッチを生成した場合、それらをすべて一意であると想定して、それぞれのテストを保存しても安全でしょうか?
ボーナス質問
GUIDの一意性をテストする最適な方法は?ブルームフィルターかな?
回答:
はい、できます。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スペースは理解できないほど大規模です。私はそれに畏敬の念を抱いています。)
10^14
細胞があり、1,065億人が生きてきました。または、2.385 * 10^23
米国の公的債務の1セントごとのUUID。
短い答え:実用的な目的のために、はい。
ただし、誕生日のパラドックスを考慮する必要があります!
いくつかの代表的な衝突確率を計算しました。ウィキペディアの記事で指定されている 122ビットのUUID を使用すると、少なくとも2.71492e18
UUID を生成した場合、衝突の確率は1/2になります。10 ^ 19 UUIDの場合、確率は0.999918です。U ^ 10 ^ 17の場合、0.000939953。
比較のためのいくつかの数字はウィキペディアにあります。そのため、生存している各人間、観測可能な宇宙の各銀河、海の各魚、地球上の各アリに安全にUUIDを割り当てることができます。ただし、人類が1年間に生成するトランジスタごとにUUID、地球上の各昆虫、地球上の砂粒、観測可能な宇宙の各星、またはそれ以上の大きさのUUIDを生成する場合、衝突はほぼ確実です。
1秒あたり10億のUUIDを生成する場合、10%の衝突確率を得るには約36年かかります。
最終的には、人類の歴史の中で生成されたUUIDのセット間に衝突が発生する可能性があります。それでも、衝突したUUIDが同じ目的で使用される可能性は非常に低いため、実際には問題はありません。
衝突の可能性の分析はWikipediaで利用できます:http : //en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates
リンクで述べたように、これは乱数ジェネレーターのプロパティの影響を受けます。
GUIDジェネレーターコードにバグがある可能性もあります。可能性は低いですが、数学に基づく衝突の可能性よりも高い可能性があります。
ブルームフィルターが適切な場合があります。GUIDが一意であるかどうかはすぐにわかりますが、衝突を誤って示す可能性があります。バッチを一度にテストする場合の代替方法は、バッチを並べ替えて、連続する各要素を比較することです。