2010-11-29 11 views
6

Ich bin nicht gut mit statistischer Mathematik usw. Ich frage habe, wenn ich folgendes verwenden:Math Frage zu Pythons uuid4

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

Ist double_str String als unique_str als einzigartig im Quadrat oder einfach nur ein gewisse Menge mehr einzigartig? Gibt es auch eine negative Implikation, etwas wie diese zu tun (wie eine Geburtstagssituation, etc.)? Das mag ignorant klingen, aber ich würde es einfach nicht wissen, da meine Mathematik bestenfalls Algebra 2 umfasst.

+0

Ist Einzigartigkeit ein Kontinuum? "Einzigartiger" ist immer verwirrend, auch wenn Sie verstehen können, was gemeint ist. –

+0

@Fred - 'uuid4' kann nicht garantiert keine Kollisionen erzeugen. Wenn es so wäre, würde ich mir darüber keine Sorgen machen. – orokusaki

Antwort

18

Die auch uuid4 Funktion eine UUID aus 16 zufälligen Bytes erstellt zurück und es ist extrem unwahrscheinlich, dass eine Kollision zu erzeugen, bis zu dem Punkt, an dem Sie wahrscheinlich nicht einmal darum kümmern sollte.

Wenn aus irgendeinem Grund uuid4tut produzieren ein Duplikat es viel wahrscheinlicher ist ein Programmierfehler wie beispielsweise ein Ausfall sein, um richtig den Zufallszahlengenerator als echt Pech zu initialisieren. In diesem Fall wird der Ansatz, den Sie verwenden, nicht machen es besser - ein falsch initialisierter Zufallszahlengenerator kann immer noch Duplikate auch bei Ihrem Ansatz erzeugen.

Wenn Sie die Standardimplementierung verwenden random.seed(None) Sie im source, dass nur 16 Byte der Zufallsdaten verwendet werden, sehen den Zufallszahlengenerator zu initialisieren, so ist dies ein ein Problem würden Sie zuerst lösen müssen. Auch wenn das Betriebssystem keine Zufälligkeitsquelle bereitstellt, wird die Systemzeit verwendet, die überhaupt nicht sehr zufällig ist.

Aber ignorieren diese praktischen Probleme, Sie sind grundsätzlich auf dem richtigen Weg. Um einen mathematischen Ansatz zu verwenden, müssen wir zuerst definieren, was Sie mit "Eindeutigkeit" meinen. Ich denke, eine vernünftige Definition ist die Anzahl der IDs, die Sie generieren müssen, bevor die Wahrscheinlichkeit, ein Duplikat zu erzeugen, eine Wahrscheinlichkeit von p übersteigt. Eine approcimate Formel hierfür lautet:

alt text

wo d2**(16*8) für einen einzelnen zufällig generierte UUID und 2**(16*2*8) mit Ihrem vorgeschlagenen Ansatz. Die Quadratwurzel in der Formel ist in der Tat auf die Birthday Paradox zurückzuführen. Aber wenn Sie es ausarbeiten, können Sie sehen, dass, wenn Sie den Wertebereich d bei gleichbleibender konstant halten, Sie auch quadratisch n.

+0

Richtige, falsche Initialisierung des Zufallszahlengenerators ist die Sache, um die man sich kümmern muss, nicht die verschwindend geringe Chance einer Kollision. –

+0

Ich verstehe es nicht. Heißt das, dass Python den Zufallsgenerator falsch initialisiert hat? 'uuid4' verlangt von mir keinen Zufallsgenerator. Fehle ich etwas? – orokusaki

+2

@orokusaki: Wenn Sie den Zufallszahlengenerator nicht initialisieren, wird das Standardverhalten verwendet und dies kann bedeuten, dass die Systemzeit als Startwert verwendet werden kann. Die Systemzeit ist nicht sehr zufällig - zwei verschiedene Computer werden die gleichen "zufälligen" Zahlen erzeugen, wenn die Zeit dieselbe ist. Siehe: http://docs.python.org/library/random.html#random.seed –

-1

Es hängt vom Zufallszahlengenerator ab, aber es ist fast quadratische Eindeutigkeit.

+0

Verringern Sie nicht die Dauer des PRNG, indem Sie eine andere UUID verwenden, wenn Sie nicht müssen? Deine Einzigartigkeit ist nicht quadratisch, wenn du die Zeit reduzierst, die du benötigst, um doppelte zufällige Nubmer zu erhalten. – bot403

+0

@ bot403 - das Universum ist unendlich 8D (überprüfen Sie meine Schattierungen) – orokusaki

+0

@ bot403, ja Sie reduzieren den Zeitraum, aber es hängt von der Höhe der Entropie in der PRNG, ob das wichtig ist oder nicht. –