466 Stimmen

Welche UUID-Version soll verwendet werden?

Welche Version der UUID sollten Sie verwenden? Ich habe viele Threads gesehen, die erklären, was jede Version bedeutet, aber ich habe Schwierigkeiten herauszufinden, was am besten für welche Anwendungen ist.

587voto

Gabe Punkte 82268

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 Netzwerkkarten-MAC-Adresse und der aktuellen Zeit. Wenn eine dieser Informationen auf irgendeine Weise sensibel ist, verwenden Sie dies nicht. Der Vorteil dieser Version ist, dass Sie beim Betrachten einer Liste von UUIDs, die von Maschinen generiert wurden, denen Sie vertrauen, leicht feststellen können, ob viele UUIDs von derselben Maschine generiert wurden, oder eine zeitliche Beziehung zwischen ihnen ableiten können.

  • Version 4: Diese werden aus zufälligen (oder pseudozufälligen) Zahlen generiert. Wenn Sie nur eine UUID generieren müssen, ist dies wahrscheinlich das, was Sie möchten. Der Vorteil dieser Version ist, dass es beim Debuggen und Betrachten einer langen Liste von Informationen, die mit UUIDs übereinstimmen, schneller ist, Übereinstimmungen zu erkennen.

Wenn Sie reproduzierbare UUIDs aus gegebenen Namen generieren müssen, möchten Sie eine Version 3 oder Version 5. Wenn Sie mit anderen Systemen interagieren, wurde diese Wahl bereits getroffen und Sie sollten überprüfen, welche Versionen und Namensräume sie verwenden.

  • Version 3: Dies generiert eine eindeutige ID aus einem MD5-Hash eines Namensraums und eines Namens. Wenn Sie mit sehr strengen Ressourcenanforderungen arbeiten (z.B. einem sehr beschäftigten Arduino-Board), verwenden Sie dies.

  • Version 5: Dies generiert eine eindeutige ID aus einem SHA-1-Hash eines Namensraums und eines Namens. Dies ist die sicherere und allgemein empfohlene Version.

66voto

anregen Punkte 1580

Wenn Sie eine Zufallszahl möchten, verwenden Sie eine Zufallszahl-Bibliothek. Wenn Sie einen eindeutigen Bezeichner mit effektiv 0,00...viele weitere 0s hier...001% Kollisionswahrscheinlichkeit möchten, sollten Sie UUIDv1 verwenden. Siehe Beitrag von Nick für UUIDv3 und v5.

UUIDv1 ist NICHT sicher. Es soll das auch nicht sein. Es soll EINDEUTIG sein, nicht unerrätbar. UUIDv1 verwendet den aktuellen Zeitstempel, plus eine Gerätekennung, plus ein bisschen Zufälliges, um eine Nummer zu generieren, die nie wieder von diesem Algorithmus erzeugt wird. Dies ist für eine Transaktions-ID angemessen (auch wenn jeder Millionen von Transaktionen/S macht).

Um ehrlich zu sein, verstehe ich nicht, warum UUIDv4 existiert... aus dem Lesen von RFC4122 scheint es, dass diese Version die Möglichkeit von Kollisionen NICHT beseitigt. Es ist nur ein Zufallszahlengenerator. Wenn das stimmt, haben Sie eine sehr GUTE Chance, dass zwei Maschinen auf der Welt schließlich dieselbe "UUID"v4 erstellen (Anführungszeichen, weil es keinen Mechanismus gibt, der die universelle Eindeutigkeit garantiert). In dieser Situation glaube ich nicht, dass dieser Algorithmus in einem RFC über Methoden zur Generierung eindeutiger Werte gehört. Er würde eher in einem RFC über die Generierung von Zufälligkeit gehören. Für eine Gruppe von Zufallszahlen:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

22voto

Nik Bougalis Punkte 10352

Dies ist eine sehr allgemeine Frage. Eine Antwort lautet: "Es hängt davon ab, welche Art von UUID Sie generieren möchten". Aber eine bessere Antwort ist: "Nun, bevor ich antworte, können Sie uns sagen, warum Sie Ihren eigenen UUID-Generierungsalgorithmus programmieren müssen, anstatt die UUID-Generierungsfunktionalität aufzurufen, die die meisten modernen Betriebssysteme bieten?"

Das ist einfacher und sicherer, und da Sie wahrscheinlich nicht brauchen Ihren eigenen zu generieren, warum sich die Mühe machen, eine Implementierung zu programmieren? In diesem Fall lautet die Antwort: Verwenden Sie das, was Ihr Betriebssystem, Programmiersprache oder Framework bereitstellt. Beispielsweise gibt es in Windows CoCreateGuid oder UuidCreate oder eine der verschiedenen Wrapper, die von den zahlreichen verwendeten Frameworks verfügbar sind. In Linux gibt es uuid_generate.

Wenn Sie, aus irgendeinem Grund, unbedingt Ihren eigenen generieren müssen, dann haben Sie zumindest die Vernunft, sich von der Generierung von v1 und v2 UUIDs fernzuhalten. Es ist schwierig, diese korrekt zu bekommen. Bleiben Sie stattdessen bei v3, v4 oder v5 UUIDs.

Update: In einem Kommentar erwähnen Sie, dass Sie Python verwenden und verlinken zu diesem. Beim Durchsehen der bereitgestellten Schnittstelle wäre die einfachste Option für Sie die Generierung einer v4 UUID (also einer aus zufälligen Daten erstellten) durch den Aufruf von uuid.uuid4().

Wenn Sie Daten haben, die Sie zur Generierung einer UUID hashen müssen (oder können), dann können Sie entweder v3 (das auf MD5 basiert) oder v5 (das auf SHA1 basiert) verwenden. Das Generieren einer v3 oder v5 UUID ist einfach: Wählen Sie zunächst den UUID-Typ aus, den Sie generieren möchten (Sie sollten wahrscheinlich v5 wählen) und wählen Sie dann den entsprechenden Namespace aus und rufen Sie die Funktion mit den Daten auf, die Sie verwenden möchten, um die UUID zu generieren. Wenn Sie beispielsweise eine URL hashen, verwenden Sie NAMESPACE_URL:

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

Bitte beachten Sie, dass diese UUID für die gleiche URL anders sein wird als die v5 UUID, die wie folgt generiert wird:

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

Eine schöne 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, werden sie (oder zumindest sollten sie) die gleiche UUID generieren, wenn alle anderen Dinge gleich sind (d.h. die gleiche Version UUID generieren, mit dem gleichen Namespace und den gleichen Daten). Diese Eigenschaft kann in manchen Situationen sehr nützlich sein (insbesondere in Szenarien mit Inhalten, die auf Adressen basieren), aber vielleicht nicht in Ihrem speziellen Fall.

7voto

Hossein Punkte 3011
  • Version 1: UUIDs mit einem Zeitstempel und einem monotonen Zähler.
  • Version 3: UUIDs basierend auf dem MD5-Hash einiger Daten.
  • Version 4: UUIDs mit zufälligen Daten.
  • Version 5: UUIDs basierend auf dem SHA1-Hash einiger Daten.
  • Version 6: UUIDs mit einem Zeitstempel und einem monotonen Zähler.
  • Version 7: UUIDs mit einem Unix-Zeitstempel.
  • Version 8: UUIDs mit benutzerdefinierten Daten.

Erfahren Sie mehr unter Rust-Dokumentation.

3voto

Eugen Konkov Punkte 18206

Die Postgres-Dokumentation beschreibt die Unterschiede zwischen UUIDs. Ein paar davon:

V3:

uuid_generate_v3(namespace uuid, name text) - Diese Funktion generiert eine Version 3 UUID im angegebenen Namespace unter Verwendung des angegebenen Namens.

V4:

uuid_generate_v4 - Diese Funktion generiert eine Version 4 UUID, die ausschließlich aus Zufallszahlen abgeleitet ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X