6

私は統計数学などが得意ではありません。次のものを使用するかどうか疑問に思っていました。

import uuid
unique_str = str(uuid.uuid4())
double_str = ''.join([str(uuid.uuid4()), str(uuid.uuid4())])

double_str文字列の二乗は、同じくらいユニークですか、それともunique_str少しだけユニークですか?また、このようなこと(誕生日の問題の状況など)にマイナスの影響はありますか?これは無知に聞こえるかもしれませんが、私の数学はせいぜい代数2にまたがっているので、私は単に知りません。

4

3 に答える 3

18

このuuid4関数は、ランダムな 16 バイトから作成された UUID を返します。衝突が発生する可能性は非常に低いため、おそらく心配する必要さえありません。

何らかの理由で重複uuid4 発生する場合は、真の不運よりも、乱数ジェネレーターを正しく初期化できなかったなどのプログラミング エラーである可能性がはるかに高くなります。その場合、使用しているアプローチでは改善されません。誤って初期化された乱数ジェネレーターは、アプローチを使用しても重複を生成する可能性があります。

デフォルトの実装を使用すると、乱数ジェネレーターの初期化に 16 バイトの乱数のみが使用されることがソースrandom.seed(None)でわかるため、これは最初に解決しなければならない問題です。また、OS がランダム性のソースを提供しない場合、システム時刻が使用されますが、これはまったくランダムではありません。

しかし、これらの実際的な問題を無視すると、基本的には正しい方向に進んでいます。数学的アプローチを使用するには、まず「一意性」の意味を定義する必要があります。合理的な定義は、重複を生成する確率が確率を超える前に生成する必要がある ID の数だと思いますp。これに対する適切な式は次のとおりです。

代替テキスト

whered2**(16*8)、ランダムに生成された単一のuuidであり2**(16*2*8)、提案されたアプローチを使用しています。式の平方根は、実際には誕生日のパラドックスによるものです。しかし、うまくいけば、値の範囲を一定にd保ちながら2 乗すると、 も 2 乗することがわかります。pn

于 2010-11-29T17:45:22.580 に答える
1

uuid4 は疑似乱数ジェネレーターに基づいているため、2 回呼び出しても「一意性」の量は 2 乗されません (また、一意性がまったく追加されない場合もあります)。

Python で uuid.uuid1() と uuid.uuid4() をいつ使用する必要がありますか?も参照してください。

于 2010-11-29T17:45:05.310 に答える
-1

乱数発生器にもよりますが、ほぼ二乗一意性です。

于 2010-11-29T17:44:35.840 に答える