Ein Universally Unique Identifier (UUID) ist ein 128-Bit-Label, das in Computersystemen zur eindeutigen Identifizierung von Informationen verwendet wird. UUIDs sind so konzipiert, dass sie räumlich und zeitlich eindeutig sind, sodass sie unabhängig und ohne zentrale Autorität generiert werden können, wodurch das Risiko einer Duplizierung minimiert wird.
UUIDs dienen verschiedenen Zwecken, darunter:
- Identifizieren von Datensätzen in Datenbanken.
- Taggen von Objekten in verteilten Systemen.
- Dienen als Primärschlüssel in Anwendungen, bei denen Eindeutigkeit entscheidend ist.
Anwendungsfälle aus der Praxis
-
Datenbanken: UUID wird als Primärschlüssel in relationalen Datenbanken verwendet, um die eindeutige Identifizierung von Datensätzen sicherzustellen.
-
Microservices: Erleichtern Sie die Servicekommunikation durch die Bereitstellung eindeutiger Kennungen für Anfragen und Ressourcen.
-
IoT-Geräte: Identifizieren Sie Geräte eindeutig in einem Netzwerk und stellen Sie sicher, dass Daten aus mehreren Quellen ohne Konflikte aggregiert werden können.
Vor- und Nachteile bei der Verwendung von UUID
Vorteile:
-
Globale Einzigartigkeit: Es ist äußerst unwahrscheinlich, dass UUIDs kollidieren, wodurch sie für verteilte Systeme geeignet sind, in denen mehrere Knoten unabhängig voneinander Identifikatoren generieren.
-
Keine zentrale Autorität erforderlich: Sie können ohne Koordination generiert werden, was den Betrieb in verteilten Umgebungen vereinfacht.
-
Skalierbarkeit: Sie funktionieren gut in Systemen, die eine Skalierung über mehrere Server oder Dienste hinweg erfordern.
Nachteile:
-
Speichergröße: UUIDs verbrauchen mehr Speicherplatz (128 Bit) im Vergleich zu herkömmlichen Ganzzahl-IDs (typischerweise 32 Bit), was zu höheren Speicherkosten führen kann.
-
Leistungsprobleme: Die Indizierung von UUIDs kann aufgrund ihrer Zufälligkeit und Größe die Datenbankleistung beeinträchtigen, was zu langsameren Abfragezeiten im Vergleich zu sequentiellen IDs führt.
-
Benutzerunfreundlichkeit: UUIDs sind nicht leicht zu merken oder benutzerfreundlich, wenn sie in Benutzeroberflächen dargestellt werden.
Der Standard
Die Standarddarstellung einer UUID besteht aus 32 hexadezimalen Zeichen, die in fünf durch Bindestriche getrennte Gruppen unterteilt sind und dem Format 8-4-4-4-12 folgen, was insgesamt 36 Zeichen ergibt (32 alphanumerische plus 4 Bindestriche). .
Das UUID-Format kann wie folgt visualisiert werden:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Wo:
-
M gibt die UUID-Version an.
-
N gibt die Variante an, die bei der Interpretation des UUID-Layouts hilft.
Komponenten einer UUID
-
TimeLow: 4 Bytes (8 Hexadezimalzeichen), die das untere Feld des Zeitstempels darstellen.
-
TimeMid: 2 Bytes (4 Hexadezimalzeichen), die das mittlere Feld des Zeitstempels darstellen.
-
TimeHighAndVersion: 2 Bytes (4 Hex-Zeichen), die die Versionsnummer und das obere Feld des Zeitstempels enthalten.
-
ClockSequence: 2 Bytes (4 Hex-Zeichen), die zur Vermeidung von Kollisionen verwendet werden, insbesondere wenn mehrere UUIDs schnell hintereinander generiert werden oder wenn die Systemuhr angepasst wird.
-
Knoten: 6 Bytes (12 Hexadezimalzeichen), die normalerweise die MAC-Adresse des generierenden Knotens darstellen.
Arten von UUIDs
Version 1: Zeitbasierte UUIDs, die eine Kombination aus dem aktuellen Zeitstempel und der MAC-Adresse des generierenden Knotens verwenden. Diese Version gewährleistet Einzigartigkeit über Raum und Zeit hinweg.
Version 2: Ähnlich wie Version 1, enthält jedoch lokale Domänenkennungen; Aufgrund seiner Einschränkungen wird es jedoch weniger häufig verwendet.
Version 3: Namensbasierte UUIDs, die mithilfe eines MD5-Hashs einer Namespace-ID und eines Namens generiert werden.
Version 4: Zufällig generierte UUIDs, die eine hohe Zufälligkeit und Einzigartigkeit bieten, wobei nur wenige Bits für die Versionierung reserviert sind.
Version 5: Wie Version 3, verwendet jedoch SHA-1 für das Hashing, was es sicherer als Version 3 macht.
Varianten
Das Variantenfeld in einer UUID bestimmt deren Layout und Interpretation. Zu den häufigsten Varianten gehören:
-
Variante 0: Reserviert für NCS-Abwärtskompatibilität.
-
Variante 1: Das Standardlayout, das für die meisten UUIDs verwendet wird.
-
Variante 2: Wird für DCE-Sicherheits-UUIDs verwendet, die weniger verbreitet sind.
-
Variante 3: Reserviert für zukünftige Definitionen.
Beispiel
Für Version 4 könnte eine UUID so aussehen:
550e8400-e29b-41d4-a716-446655440000
Hier:
-
41d4 zeigt an, dass es sich um eine Version 4 handelt.
-
a7 stellt die Variante dar, in diesem Fall die übliche „Leach-Salz“-Variante.
Wie UUIDs berechnet werden
-
Version 1 (zeitbasiert):
- Der Zeitstempel ist typischerweise die Anzahl der 100-Nanosekunden-Intervalle seit dem 15. Oktober 1582 (dem Datum der gregorianischen Kalenderreform).
- Der Knoten ist die MAC-Adresse der Maschine, die die UUID generiert.
- Die Taktsequenz trägt dazu bei, die Eindeutigkeit sicherzustellen, wenn sich die Uhrzeit ändert (z. B. aufgrund von Systemneustarts).
-
Version 3 und Version 5 (namensbasiert):
- Ein Namespace (wie eine DNS-Domäne) wird mit einem Namen (wie einem Dateipfad oder einer URL) kombiniert und gehasht.
- Der Hash (MD5 für Version 3, SHA-1 für Version 5) wird dann in ein UUID-Format strukturiert, um sicherzustellen, dass die Versions- und Variantenfelder richtig eingestellt sind.
-
Version 4 (Zufallsbasiert):
- Für die 122 Bits der UUID werden Zufalls- oder Pseudozufallszahlen generiert.
- Die Versions- und Variantenfelder werden entsprechend festgelegt, um die Einhaltung der UUID-Standards sicherzustellen.
UUIDv4-Berechnungsbeispiel
Schritt 1: Generieren Sie 128 Zufallsbits
Angenommen, wir generieren den folgenden 128-Bit-Zufallswert:
11001100110101101101010101111010101110110110111001011101010110110101111011010011011110100100101111001011
Schritt 2: UUIDv4-Version und -Variante anwenden
Version: Ersetzen Sie die Bits 12-15 (4. Zeichen) durch 0100 (für UUID-Version 4).
Original: 1100 wird zu 0100 → Aktualisierter Wert an dieser Position.
Variante: Ersetzen Sie die Bits 6-7 des 9. Bytes durch 10 (für die RFC 4122-Variante).
Original: 11 wird zu 10 → Aktualisierter Wert an dieser Position.
Schritt 3: Formatieren Sie es in Hexadezimalzahl
Konvertieren Sie die 128-Bit-Binärdatei in 5 Hexadezimalgruppen:
- 32-Bit-Gruppe: 11001100110101101101010101111010 → ccda55ba
- 16-Bit-Gruppe: 1011101101101110 → b76e
- 16-Bit-Gruppe: 0100010101000101 → 4545 (mit 0100 für Version 4)
- 16-Bit-Gruppe: 1010110111110010 → adf2 (mit 10 für die Variante)
- 48-Bit-Gruppe: 11010011011110100100101111001011 → d39d25cb
Schritt 4: Kombinieren Sie die Gruppen
Die endgültige UUID würde so aussehen:
ccda55ba-b76e-4545-adf2-d39d25cb