Das erste Mal, dass UUIDs mir wirklich wichtig waren, bewegte ich ein WordPress-benachteiligtes SaaS von einer einzelnen MySQL-Box in ein Setup mit einem Lese-Replikat und einem späteren Plan, der später Shard zu Shard. Auto-Increment-IDs waren jahrelang in Ordnung - bis zwei Dienste anfingen, in die gleiche logische Tabelle einzufügen, und plötzlich id = 42 bedeutete zwei verschiedene Reihen. Das ist der Moment, in dem die automatische Inkrementierung nicht mehr funktioniert, und UUIDs sind die übliche Antwort.
Eine UUID ist ein 128-Bit-Wert, den Sie auf jeder Maschine jederzeit und ohne Koordination generieren können und dennoch ein Unikat zu sein. Dieser "keine Koordination"-Teil ist der springende Punkt: Eine mobile App im Flugzeug, drei Mikrodienste und ein Hintergrundarbeiter können alle mint-IDs gleichzeitig und niemals kollidieren. Die Mathematik, die dieses Vertrauen stützt, ist wirklich absurd, und ich werde Ihnen in einer Sekunde zeigen, wie absurd.
der UUID-Generator Auf toolz.dev erstellt ein oder mehrere UUIDs in mehreren Versionen sofort, direkt in Ihrem Browser – praktisch, wenn Sie einen Tisch säen oder eine Wegwerf-ID für einen Test benötigen. Dieser Leitfaden beschreibt, was die Versionen tatsächlich bedeuten, welche im Jahr 2026 ausgewählt werden soll, wie man sie speichert, ohne den Datenbankindex zu zerstören, und welche Fehler ich gemacht habe, damit Sie sie überspringen können.
tl; dr: Für neue Datenbank-Primärschlüssel im Jahr 2026 generieren UUID V7 — Es ist zeitbestimmt, damit es gut indiziert und es nicht Hardware wie V1 gibt. V4 Wenn Sie reine Unvorhersehbarkeit wollen. Speichern Sie sie als Eingeborener
uuidTyp oderBINARY(16), nieVARCHAR(36)drohen Machen Sie sie in großen Mengen mit dem UUID-Generator, und kombiniere es mit dem Zeitstempelkonverter die Zeit in einer V7 zu lesen. Alle clientseitig, alles kostenlos.
Was genau ist eine UUID?
Eine UUID (universally Unique Identifier) ist eine 128-Bit-Nummer, die verwendet wird, um etwas zu identifizieren, ohne dass eine zentrale Behörde IDs ausgibt. Microsoft nennt das Gleiche eine GUID (global eindeutige Kennung), sie sind in jeder Hinsicht identisch. Die kanonische Textform besteht aus 36 Zeichen - 32 Hex-Ziffern, die in fünf getrennte Gruppen von 8-4-4-4-12 unterteilt sind:
550e8400-e29b-41d4-a716-446655440000
Zwei dieser Hex-Positionen sind keine zufälligen Daten - es sind Metadaten. Die 13. Hex-Ziffer codiert die Version (Welche Generationsstrategie hat es gemacht), und die erste Ziffer der vierten Gruppe codiert die unterschiedlich (welcher Layout-Standard folgt – 8, 9, a, oder b für die Standard-UUIDs). Also im obigen Beispiel die 4 In der dritten Gruppe sagt man, dass es eine V4 ist.
Wie einzigartig ist "einzigartig" wirklich?
Nachdem die Version und die Variantenbits reserviert sind, hat eine V4-UUID 122 zufällige Bits. Das sind 2 ^ 122 mögliche Werte oder ungefähr 5,3 undecillion:
5,316,911,983,139,663,491,615,228,241,121,400,000
Um diesen Beton zu machen: Wenn Sie jede Sekunde eine Milliarde UUIDs generiert haben, brauchen Sie ungefähr 86 Jahre, bevor Sie sogar eine 50% ige Chance auf a erreichen Single Kollision überall. In der Praxis treten keine V4-Kollisionen auf und Sie können so gestalten, als ob sie es niemals tun werden.
Was ist der Unterschied zwischen UUID V1, V4 und V7?
Die Spezifikation - ursprünglich RFC 4122, jetzt aktualisiert von RFC 9562 (2024) — Definiert mehrere Versionen. Drei Dinge für die tägliche Arbeit.
UUID V1 — Zeitstempel + MAC-Adresse
V1 sticht einen 100-Nanosekunden-Zeitstempel zusammen (ab dem 15. Oktober 1582 das Datum, an dem der Gregorianische Kalender begann - eines meiner Lieblingsstücke von Spezifikations-Trivia) mit der MAC-Adresse der Netzwerkkarte. Es ist natürlich zeitbestellt und Sie können die Erstellungszeit daraus extrahieren.
Das Problem liegt genau dort in der Definition: Es bettet die MAC-Adresse des Computers ein, das es hergestellt hat. Das leckt die Hardwareidentität und macht in Kombination mit dem Zeitstempel IDS etwas vorhersehbar. Beispiel: 6ba7b810-9dad-11d1-80b4-00c04fd430c8drohen Ich würde jetzt nur v1 für die Legacy-Kompatibilität verwenden.
UUID V4 – Zufällig
V4 ist 122 Bit Zufälligkeit und nichts anderes. Es ist die Version, die die meisten Leute meinen, wenn sie "UUID" sagen, und es ist absolut einfach: kein Zeitstempel, keine Hardware, keine Bestellung. Beispiel: f47ac10b-58cc-4372-a567-0e02b2c3d479drohen
Der Vorteil ist, dass es nichts ausläuft und unvorhersehbar ist. Genau das wollen Sie für alles, was nicht raten kann. Der Nachteil ist, dass es strittig, so dass aufeinanderfolgende Einfügungen über Ihren gesamten Index verteilt sind - wie ich herausgefunden habe, haben Sie echte Leistungskosten in großem Maßstab.
UUID V7 — Zeit-geordnet + zufällig
V7 ist der moderne Kompromiss, standardisiert in RFC 9562. Die ersten 48 Bits sind ein Unix-Zeitstempel in Millisekunden, der Rest ist zufällig. Beispiel: 018e4880-d4d0-7b9c-8c37-2a5c0f1e3d8adrohen
Dieses Layout bedeutet, dass V7-IDs chronologisch sortieren - neue Zeilen landen am "Ende" eines B-Baum-Index anstelle von Streuung - und sind dennoch global einzigartig und koordinationsfrei. Es leckt ungefähr die Erstellungszeit (normalerweise in Ordnung), aber keine Hardware. Für neue Projekte ist dies mein Standard-Primärschlüssel, und es ist die Richtung, in die die IETF jetzt auch zeigt.
Hier ist der Kompromiss auf einen Blick:
| Version | bestellt? | undicht sein | am besten für |
|---|---|---|---|
| V1 | Ja (Zeit) | MAC-Adresse + Zeit | Nur Legacy-Systeme |
| V4 | Nein (zufällig) | nichts | Ungenerierende Token, allgemeine IDs |
| V7 | Ja (Zeit) | ungefähre Erstellungszeit | Neue Datenbank-Primärschlüssel |
Die weniger verwendeten Versionen sind ebenfalls vorhanden: V3 und V5 sind deterministische Hashes eines Namespaces und eines Namens (v5 verwendet SHA-1 und wird gegenüber V3'S MD5 bevorzugt), V6 ist eine neu geordnete V1 und V8 ist für benutzerdefinierte Implementierungen reserviert.
Sollten Sie UUIDs oder Auto-Increment-IDs verwenden?
Dies ist die Debatte, die ich in mehr Design-Reviews als in jeder anderen geführt habe. Hier ist der Rahmen, den ich tatsächlich verwende, und nicht eine religiöse Antwort.
Halten Sie sich an die automatische Inkrementierung, wenn Sie haben eine einzige Datenbank, Leistung und Speicher sind eng und die Menschen müssen die IDs lesen. Eine Ganzzahl beträgt 4–8 Bytes gegenüber einer UUID 16, ganzzahlige Vergleiche sind schneller und "Bestellung # 12345" ist viel einfacher als eine UUID mit 36 Zeichen. Auf einer einzigen Box ohne Sharding ist Auto-Increment wirklich die einfachere und schnellere Wahl - greifen Sie nicht nach UUIDs.
Wechseln Sie zu UUIDs, wenn Alle diese sind wahr: Sie sind verteilt (mehrere Dienste oder Server, die unabhängig voneinander prägen), Sie sind besorgt über die Aufzählung (Auto-Inkrement-IDs sind ratenwürdig und geben Ihre Datensatzzahl leise an - /users/1234 Wenn ein Angreifer weniger als 1.235 Benutzer hat), müssen Sie Daten aus mehreren Datenbanken ohne Kollisionen zusammenführen oder Clients vor der Synchronisierung IDs generieren. Dieser Aufzählungspunkt ist eine echte Sicherheitsüberlegung, die die Leute unterschätzten.
Und der V7-Mittelweg: UUID V7 gibt Ihnen die verteilte Generierung einer UUID und Die indexfreundliche Bestellung von Auto-Inkrementen, ohne dass die Datensatze durch undicht ist. Für die meisten neuen Projekte im Jahr 2026, die nicht sequentielle IDs benötigen, ist V7 die Antwort, die die Debatte beendet.
Wie speichern Sie UUIDs, ohne Ihren Index zu zerstören?
Dies ist der Abschnitt, der aus meinem eigenen teuren Fehler hervorgeht. Achten Sie also hier, wenn auch nirgendwo anders.
Bei dieser Migration habe ich die neuen UUIDs als gespeichert VARCHAR(36) Weil es die offensichtliche, lesbare Sache war. Es hat funktioniert - und dann ist der Tisch gewachsen und eingefügt und joggen wurden messbar langsamer. Zwei Probleme haben sich zusammengesetzt: Ich habe 36 Bytes pro ID anstelle von 16 ausgegeben, und Ich verwendete zufällige V4-UUIDs, so dass jeder Einfügungsort an einer zufälligen Stelle im Primärschlüsselindex landete, ihn fragmentierte und den Pufferpool schlug. Der Fix bestand darin, sie als binär zu speichern und beim nächsten Projekt auf v7 umzuschalten, sodass die Einfügungen sequentiell blieben.
PostgreSQL hat einen Eingeborenen uuid Typ — Verwenden Sie es. Es speichert 16 Bytes und vergleicht schnell:
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
MySQL Hat keinen nativen UUID-Typ, also speichern BINARY(16) und konvertieren mit UUID_TO_BIN() / BIN_TO_UUID()drohen Das zweite Argument zählt:
CREATE TABLE users (
id BINARY(16) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- The `true` swaps the timestamp bytes for better index locality on v1
INSERT INTO users (id, name, email)
VALUES (UUID_TO_BIN(UUID(), true), 'Alice', '[email protected]');
SELECT BIN_TO_UUID(id, true) AS id, name, email FROM users;
Die Regel, an die Sie sich erinnern sollten: nativ uuid Geben Sie dort ein, wo Sie eine haben, BINARY(16) wo Sie nicht, und VARCHAR(36) Grundsätzlich nie für einen Schlüssel, den Sie indizieren und sich anschließen.
Wie generieren Sie UUIDs im Code?
Für eine schnelle Einzelauszahlung UUID-Generator ist schneller als das Öffnen einer Repl. Im Code hat jede wichtige Sprache dies eingebaut oder einen Schritt entfernt.
Javascript / Typoskript — Der Browser und der Knoten liefern jetzt einen V4-Generator:
const id = crypto.randomUUID(); // v4, no dependency needed
// For v7, use the 'uuid' package:
import { v7 as uuidv7 } from 'uuid';
const ordered = uuidv7();
Python:
import uuid
uuid.uuid4() # random
uuid.uuid5(uuid.NAMESPACE_DNS, 'example.com') # deterministic (SHA-1)
Java: UUID.randomUUID() Gibt Ihnen V4 aus der Box; v7 benötigt eine Bibliothek wie java-uuid-generator oder eine kleine RFC 9562-Implementierung.
Geh: github.com/google/uuid gibt euch beide - uuid.New() für v4 und uuid.NewV7() Für V7.
Beachten Sie, dass native Laufzeithelfer fast immer v4 geben. Wenn Sie V7 speziell für die Bestellung benötigen, benötigen Sie normalerweise eine Bibliothek, da dies der neuere Standard ist und nicht jede stdlib aufgeholt hat.
Wo tauchen UUIDs tatsächlich in realen Systemen auf?
Es ist einfach, über UUIDs in der Zusammenfassung zu sprechen, also hier sind die konkreten Orte, auf die ich mich verlassen habe, da die Version, die Sie auswählen, wirklich vom Job abhängt.
Datenbank-Primärschlüssel in einem verteilten Setup. Dies ist der klassische Fall und derjenige, der diesen Artikel für mich gestartet hat. In dem Moment, in dem mehr als ein Writer in dieselbe logische Tabelle eingefügt werden kann - Replikate, Shards oder zwei Dienste, die ein Schema teilen -, werden automatische Erhöhungen unterbrochen. Ein V7-Primärschlüssel löst das Koordinationsproblem und indiziert immer noch sauber, weil es zeitlich geordnet ist.
Clientgenerierte IDs für Offline-First-Apps. Eine mobile App oder ein Browser-Spa muss häufig einen Datensatz erstellen, bevor er mit dem Server kommunizieren kann. Denken Sie an eine Notiz, die in einem Flugzeug geschrieben ist, oder an eine optimistische Benutzeroberfläche, die die neue Zeile sofort anzeigt. Wenn der Client eine UUID im Voraus abzeichnet, hat der Datensatz eine stabile Identität vom ersten Tastendruck ab und synchronisiert später ohne Server-Rundfahrt, um eine ID zu erhalten. Ich habe dies verwendet, um Formulare auch bei flockigen Verbindungen sofort anfühlen zu lassen.
Nicht aufzählbare Ressourcenkennungen in URLs und APIs. Aufmachung /orders/1042 In einer URL sagt jeder leise, dass Sie höchstens 1.042 Bestellungen hatten, und lassen Sie ihn laufen /orders/1041, /orders/1040, und so weiter. Durch das Tauschen einer UUID werden sowohl das betriebswirtschaftliche Leck als auch die einfache Aufzählung entfernt. Für alles, was ein Benutzer in einer URL sehen kann, lohnt sich dies - obwohl Sie sich daran erinnern, dass eine UUID kein Zugriffssteuerungsmechanismus ist, Sie benötigen noch echte Berechtigungsprüfungen.
Korrelations-IDs für die Verfolgung. Wenn eine einzelne Anforderung in fünf Mikrodiensten auffächert, indem eine UUID als Korrelations-ID angehängt und bei jedem Hopfen protokolliert wird "Irgendwo in diesem Durcheinander wird etwas fehlgeschlagen" in eine einzelne grepierbare Zeichenfolge in allen Protokollen. Dies ist ein Ort, an dem sogar ein einfacher V4 perfekt ist - Sie müssen nicht bestellen, nur Einzigartigkeit.
idempotenz-schlüssel. Zahlungs- und Webhook-APIs fordern den Kunden häufig auf, eine UUID als Idempotenz-Schlüssel zu senden, damit eine erneut versuchte Anfrage eine Karte nicht zweimal belastet. Der Client generiert es einmal, verwendet es bei Wiederholungen und der Server dedupliert darauf. Es ist ein kleines Muster, das eine sehr teure Bug-Klasse verhindert.
Häufig gestellte Fragen
Wofür wird eine UUID verwendet?
Eine UUID identifiziert eindeutig etwas - eine Datenbankzeile, eine API-Ressource, eine Sitzung, eine hochgeladene Datei, eine Trace über Microservices - ohne einen zentralen Dienst zum Verteilen von IDs zu benötigen. Es ist die erste Wahl, wenn mehrere Systeme oder Clients unabhängig voneinander IDs erstellen müssen und dennoch sicher sein werden, dass sie nicht in Konflikt geraten. Sie können sofort einen generieren mit dem UUID-Generator Auf toolz.dev.
Können zwei UUIDs jemals identisch sein?
Theoretisch ja, in der Praxis nein. Eine V4-UUID hat 122 zufällige Bits, was ungefähr 5,3 undecillion Möglichkeiten ergibt. Sie müssen in der Größenordnung von 2,7 Billionen UUIDs generieren, bevor Sie eine Chance von 50% sogar einer Kollision erreichen. Für jeden echten technischen Zweck können Sie UUIDs als garantiert einzigartig behandeln.
Welche UUID-Version soll ich 2026 verwenden?
Für neue Datenbank-Primärschlüssel ist UUID V7 - es ist zeitlich für eine effiziente Indexierung geordnet, während es global einzigartig bleibt, und es ist die aktuelle IETF-Empfehlung unter RFC 9562. Verwenden Sie V4, wenn Unvorhersehbarkeit wichtig ist, z. B. Bezeichner, die nicht raten können. Vermeiden Sie v1 für neue Arbeiten, da die MAC-Adresse der Generatormaschine eingebettet wird.
Sind UUIDs sequentiell?
V1 und V7 sind zeitbestimmt, also später generierte IDs nach früheren sortieren, V4 ist voll zufällig ohne Reihenfolge. Die sequentielle Reihenfolge macht V7 für B-Tree-Indizes freundlich - neue Zeilen hängen eher an als zu streuen. Wenn Sie zufällige V4 als Primärschlüssel auf einem großen Tisch verwenden, kann diese fehlende Ordnung die Insert- und Index-Performance beeinträchtigen.
Wie soll ich UUIDs in einer Datenbank speichern?
Verwenden Sie den Eingeborenen uuid Geben Sie ein, wenn Ihre Datenbank eine hat (PostgreSQL tut es). Sonst lagern BINARY(16)und in MySQL 8.0+ konvertieren mit UUID_TO_BIN() und BIN_TO_UUID()drohen vermeiden VARCHAR(36) oder CHAR(36) Für Schlüssel - String Storage verschwendet 20 Byte pro Zeile und verlangsamt jeden Vergleich, was sich auf großen Tabellen schnell ergibt.
Was ist der Unterschied zwischen einer UUID und einer GUID?
Sie sind das Gleiche. UUID ist der Begriff aus RFC 4122, der in den meisten Sprachen und Plattformen verwendet wird; GUID ist der Name Microsofts, der in Windows und .NET üblich ist. Das Format und die Garantien sind identisch, sodass Sie eine GUID und eine UUID austauschbar behandeln können.
Kann ich die Erstellungszeit aus einer UUID extrahieren?
Ja – sie codieren einen Zeitstempel. V7 speichert in den ersten 48 Bit einen Unix-Zeitstempel, den Sie mit dem dekodieren und lesen können Zeitstempelkonverterdrohen V4 und V5 enthalten keine Zeitinformationen, daher gibt es nichts zu extrahieren.
Ist UUID V4 sicher genug für Sitzungstoken?
Nicht allein. V4 s 122 zufällige Bits sind unvorhersehbar, aber Sitzungs- und Authentifizierungstoken benötigen im Allgemeinen mindestens 256 Bits von einem kryptographisch sicheren Generator. Verwenden Sie ein speziell erstelltes sicheres zufälliges Token für die Authentifizierung und reservieren Sie UUIDs, um Ressourcen zu identifizieren, anstatt sie zu schützen.
Wie generiere ich eine UUID?
Verwenden Sie den eingebauten Generator Ihrer Sprache: crypto.randomUUID() In modernen Browsern und Node.js, uuid.uuid4() in Python oder Guid.NewGuid() In .NET erzeugen Sie jeweils eine V4-UUID in einem einzigen Aufruf. Für eine schnelle Einzel- oder Charge generieren Sie diese sofort mit dem UUID-Generator Auf toolz.dev — Kein Code erforderlich.
Wie viele Zeichen ist eine UUID?
Eine UUID besteht aus 36 Zeichen in ihrer kanonischen Textform: 32 hexadezimale Ziffern plus den vier Bindestrichen, die sie in 8-4-4-4-12-Gruppen aufteilen. Dieser Text codiert 128 Bit, weshalb es als 16 RAW-Bytes mit gespeichert wird BINARY(16) ist weitaus kompakter als die 36-stellige Zeichenfolge.
Abschluss
UUIDs sind eine dieser Grundlagen, über die Sie nicht nachdenken, bis ein System über eine einzige Datenbank hinaus wächst - und dann sind sie alles. Die Kurzversion 2026: Standardmäßig V7 Verwenden Sie für neue Primärschlüssel V4 Wenn Sie nicht erkennbare IDs benötigen, speichern Sie sie als urwüch uuid oder BINARY(16)und überspringen Sie v1 für alles Neue. Lerne von meinem VARCHAR(36) Nachmittag, damit Sie es nicht wiederholen.
Generieren Sie sie sofort mit dem kostenlosen UUID-Generator Auf toolz.dev — Single oder Bulk, jede Version, alle clientseitig ohne hochgeladen. Wenn Sie die Zeit in einem V7 lesen müssen, greifen Sie nach der Zeitstempelkonverter, und stöbern Sie den Rest der Codierungswerkzeuge — 600+ kostenlose Dienstprogramme — vorbei bei toolz.devdrohen

