Welche Version der UUID sollten Sie verwenden? Ich habe viele Threads gesehen, in denen erklärt wurde, was jede Version beinhaltet, aber ich habe Probleme herauszufinden, was für welche Anwendungen am besten ist.
Welche Version der UUID sollten Sie verwenden? Ich habe viele Threads gesehen, in denen erklärt wurde, was jede Version beinhaltet, aber ich habe Probleme herauszufinden, was für welche Anwendungen am besten ist.
Antworten:
Es gibt zwei verschiedene Möglichkeiten, eine UUID zu generieren.
Wenn Sie nur eine eindeutige ID benötigen, möchten Sie eine Version 1 oder Version 4.
Version 1: Dies generiert eine eindeutige ID basierend auf einer MAC-Adresse der Netzwerkkarte und einem Timer. Diese IDs sind leicht vorherzusagen (wenn eine gegeben ist, kann ich möglicherweise eine andere erraten) und können auf Ihre Netzwerkkarte zurückgeführt werden. Es wird nicht empfohlen, diese zu erstellen.
Version 4: Diese werden aus Zufallszahlen (oder Pseudozufallszahlen) generiert. Wenn Sie nur eine UUID generieren müssen, ist dies wahrscheinlich das, was Sie wollen.
Wenn Sie immer dieselbe UUID aus einem bestimmten Namen generieren müssen, möchten Sie eine Version 3 oder Version 5.
Version 3: Dies generiert eine eindeutige ID aus einem MD5-Hash eines Namespace und eines Namens. Wenn Sie Abwärtskompatibilität benötigen (mit einem anderen System, das UUIDs aus Namen generiert), verwenden Sie diese.
Version 5: Dies generiert eine eindeutige ID aus einem SHA-1-Hash eines Namespace und eines Namens. Dies ist die bevorzugte Version.
reproducible
UUID aus einem bestimmten Namen generieren müssen , möchten Sie eine Version 3 oder Version 5. Wenn Sie diesem Algorithmus dieselbe Eingabe zuführen, wird dieselbe Ausgabe generiert.
Wenn Sie eine Zufallszahl wünschen, verwenden Sie eine Zufallszahlenbibliothek. Wenn Sie eine eindeutige Kennung mit effektiv 0,00 ... viel mehr Nullen hier ... 001% Kollisionswahrscheinlichkeit wünschen, sollten Sie UUIDv1 verwenden. Siehe Nicks Beitrag für UUIDv3 und v5.
UUIDv1 ist NICHT sicher. Es soll nicht sein. Es soll EINZIGARTIG sein, nicht unvorstellbar. UUIDv1 verwendet den aktuellen Zeitstempel sowie eine Maschinenkennung und einige zufällige Elemente, um eine Zahl zu erstellen, die von diesem Algorithmus nie wieder generiert wird. Dies ist für eine Transaktions-ID geeignet (selbst wenn jeder Millionen von Transaktionen ausführt).
Um ehrlich zu sein, verstehe ich nicht, warum UUIDv4 existiert ... beim Lesen von RFC4122 sieht es so aus, als würde diese Version die Möglichkeit von Kollisionen NICHT ausschließen. Es ist nur ein Zufallsgenerator. Wenn dies zutrifft, haben Sie eine sehr gute Chance, dass zwei Maschinen auf der Welt schließlich dieselbe "UUID" v4 erstellen (zitiert, weil es keinen Mechanismus zur Gewährleistung der U.niversal U.niqueness gibt). In dieser Situation glaube ich nicht, dass der Algorithmus zu einem RFC gehört, der Methoden zum Generieren eindeutiger Werte beschreibt. Es würde in einen RFC über das Erzeugen von Zufälligkeit gehören. Für eine Reihe von Zufallszahlen:
chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)
set_size
ist 2 ^ 122, was sehr groß ist .
Das ist eine sehr allgemeine Frage. Eine Antwort lautet: "Es hängt davon ab, welche Art von UUID Sie generieren möchten". Aber eine bessere ist folgende: "Bevor ich antworte, können Sie uns sagen, warum Sie Ihren eigenen UUID-Generierungsalgorithmus codieren müssen, anstatt die UUID-Generierungsfunktionalität aufzurufen, die die meisten modernen Betriebssysteme bieten?"
Dadurch , dass ist einfacher und sicherer, und da Sie wahrscheinlich nicht brauchen Ihre eigenen zu generieren, warum die Mühe eine Implementierung Codierung auf? In diesem Fall wird die Antwort unabhängig von Ihrem Betriebssystem, Ihrer Programmiersprache oder Ihrem Framework verwendet. In Windows gibt es beispielsweise CoCreateGuid oder UuidCreate oder einen der verschiedenen Wrapper, die in den zahlreichen verwendeten Frameworks verfügbar sind. Unter Linux gibt es uuid_generate .
Wenn Sie aus irgendeinem Grund unbedingt Ihre eigenen generieren müssen, haben Sie zumindest den gesunden Menschenverstand, sich von der Generierung von v1- und v2-UUIDs fernzuhalten . Es ist schwierig, diese richtig zu machen. Halten Sie sich stattdessen an die UUIDs v3, v4 oder v5.
Update : In einem Kommentar erwähnen Sie, dass Sie Python verwenden, und verlinken darauf . Wenn Sie sich die bereitgestellte Schnittstelle ansehen, ist es für Sie am einfachsten, durch Aufrufen eine v4-UUID (dh eine aus zufälligen Daten erstellte UUID) zu generieren uuid.uuid4()
.
Wenn Sie über Daten verfügen, die Sie zum Generieren einer UUID benötigen (oder können), können Sie entweder v3 (basierend auf MD5) oder v5 (basierend auf SHA1) verwenden. Das Generieren einer v3- oder v5-UUID ist einfach: Wählen Sie zuerst den UUID-Typ aus, den Sie generieren möchten (Sie sollten wahrscheinlich v5 auswählen), wählen Sie dann den entsprechenden Namespace aus und rufen Sie die Funktion mit den Daten auf, aus denen Sie die UUID generieren möchten. Wenn Sie beispielsweise eine URL hashen, würden Sie Folgendes verwenden NAMESPACE_URL
:
uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')
Bitte beachten Sie, dass sich diese UUID von der v5-UUID für dieselbe URL unterscheidet, die wie folgt generiert wird:
uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')
Eine nette Eigenschaft von v3- und v5-URLs ist, dass sie zwischen Implementierungen interoperabel sein sollten. Mit anderen Worten, wenn zwei verschiedene Systeme eine Implementierung verwenden, die RFC4122 entspricht, generieren (oder sollten ) beide dieselbe UUID, wenn alle anderen Dinge gleich sind (dh dieselbe UUID der Version mit demselben Namespace und dem gleiche Daten). Diese Eigenschaft kann in einigen Situationen sehr hilfreich sein (insbesondere in inhaltsadressierbaren Speicherszenarien), in Ihrem speziellen Fall jedoch möglicherweise nicht.
NAMESPACE_URL
ist eine UUID, die normalerweise 6ba7b811-9dad-11d1-80b4-00c04fd430c8
der Empfehlung auf Seite 30 von RFC-4122 entspricht .
Die Postgres-Dokumentation beschreibt die Unterschiede zwischen UUID
s. Ein paar von ihnen:
V3:
uuid_generate_v3(namespace uuid, name text)
- Diese Funktion generiert eine UUID der Version 3 im angegebenen Namespace unter Verwendung des angegebenen Eingabenamens.
V4:
uuid_generate_v4
- Diese Funktion generiert eine UUID der Version 4, die vollständig aus Zufallszahlen abgeleitet wird.