このuuid4
関数は、ランダムな 16 バイトから作成された UUID を返します。衝突が発生する可能性は非常に低いため、おそらく心配する必要さえありません。
何らかの理由で重複uuid4
が発生する場合は、真の不運よりも、乱数ジェネレーターを正しく初期化できなかったなどのプログラミング エラーである可能性がはるかに高くなります。その場合、使用しているアプローチでは改善されません。誤って初期化された乱数ジェネレーターは、アプローチを使用しても重複を生成する可能性があります。
デフォルトの実装を使用すると、乱数ジェネレーターの初期化に 16 バイトの乱数のみが使用されることがソースrandom.seed(None)
でわかるため、これは最初に解決しなければならない問題です。また、OS がランダム性のソースを提供しない場合、システム時刻が使用されますが、これはまったくランダムではありません。
しかし、これらの実際的な問題を無視すると、基本的には正しい方向に進んでいます。数学的アプローチを使用するには、まず「一意性」の意味を定義する必要があります。合理的な定義は、重複を生成する確率が確率を超える前に生成する必要がある ID の数だと思いますp
。これに対する適切な式は次のとおりです。
whered
は2**(16*8)
、ランダムに生成された単一のuuidであり2**(16*2*8)
、提案されたアプローチを使用しています。式の平方根は、実際には誕生日のパラドックスによるものです。しかし、うまくいけば、値の範囲を一定にd
保ちながら2 乗すると、 も 2 乗することがわかります。p
n