Als mir UUIDs zum ersten Mal wirklich wichtig waren, habe ich ein WordPress-benachbartes SaaS von einer einzigen MySQL-Box auf ein Setup mit einem Lese-Replikat und einem Plan zum späteren Sharding umgestellt. Auto-Inkrement-IDs waren schon seit Jahren in Ordnung - bis zwei Dienste begannen, sich in die spätere 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 einzelne oder große UUIDs in mehreren Versionen sofort, direkt in Ihrem Browser - praktisch, wenn Sie & #39; eine Tabelle neu setzen oder eine Wegwerf-ID für einen Test benötigen. Diese Anleitung behandelt, was die Versionen tatsächlich bedeuten, welche Sie im Jahr 2026 auswählen sollten, wie Sie sie speichern können, ohne Ihren Datenbankindex zu zerstören, und die Fehler, die ich gemacht habe, damit Sie sie überspringen können.
tl; dr: Für neue Datenbank-Primärschlüssel im Jahr 2026 generieren UUID V7- it' ist zeitlich geordnet, sodass es gut indiziert, und es tut & #39; t leck Hardware wie v1. Verwenden 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 dasselbe GUID (Globally Unique Identifier); sie' sind in jeder Hinsicht identisch. Die kanonische Textform besteht aus 36 Zeichen - 32 Hex-Ziffern, aufgeteilt in fünf getrennte Gruppen von 8-4-4-4-12:
550e8400-e29b-41d4-a716-446655440000
Zwei dieser Hex-Positionen sind & #39; t Zufallsdaten - sie& #39; re Metadaten Die 13. Hex-Ziffer kodiert die Version (Welche Generationsstrategie hat es gemacht), und die erste Ziffer der vierten Gruppe codiert die unterschiedlich (welchem Layoutstandard es 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 Für die tägliche Arbeit sind drei.
UUID v1 - Zeitstempel + MAC-Adresse
V1 näht einen Zeitstempel mit 100 Nanosekunden (zählt vom 15. Oktober 1582, dem Datum, an dem der gregorianische Kalender begann - eines meiner Lieblings-Spec-Trivia) mit der Netzwerkkarte's MAC-Adresse. It's natürlich zeitbestellt und Sie können daraus die Erstellungszeit 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„Daher verstreuen aufeinanderfolgende Einfügungen über Ihren gesamten Index - was, wie ich herausgefunden habe, in großem Maßstab echte Leistungskosten verursacht.
UUID v7 - zeitbestimmt + 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
Jener Layout bedeutet, dass v7-IDs chronologisch sortieren - neue Zeilen landen auf dem & quot;end" eines B-Baum-Index statt Streuung - und dabei immer noch global eindeutig und koordinationsfrei sind Es leckt ungefähre 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 knapp, und Menschen müssen die IDs lesen Eine ganze Zahl ist 4 –8 Bytes im Vergleich zu einer UUID's 16, ganzzahlige Vergleiche sind schneller und & quot; Reihenfolge #12345" ist viel einfacher, das Telefon herunterzulesen als eine UUID mit 36 Zeichen. Auf einer einzelnen Box ohne Sharding ist automatisches Inkrement wirklich die einfachere und schnellere Wahl - don' Greifen Sie nicht zu UUIDs aus der Mode.
Wechseln Sie zu UUIDs, wenn Eines davon ist wahr: you' werden erneut verteilt (mehrere Dienste oder Server prägen unabhängig voneinander IDs), you' machen sich Sorgen über die Aufzählung (Auto-Inkrement-IDs sind erraten und geben leise Ihre Datensatzzahlen preis - /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 das Offensichtliche, Lesbare war Es funktionierte - und dann wuchs die Tabelle, und Einfügungen und Verknüpfungen wurden messbar langsamer Zwei Probleme verschärften sich: Ich gab 36 Bytes pro ID statt 16 aus 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 Node liefern jetzt beide 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 Ihnen 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 der, der diesen Artikel für mich gestartet hat Der Moment, in dem mehr als ein Autor in dieselbe logische Tabelle einfügen kann - Repliken, Scherben oder zwei Dienste, die sich ein Schema teilen - Pausen mit automatischer Inkrementierung Ein v7-Primärschlüssel löst das Koordinationsproblem und indiziert trotzdem sauber, weil er ' s zeitbestellt.
Clientgenerierte IDs für Offline-First-Apps. Eine mobile App oder ein Browser-SPA muss oft einen Datensatz erstellen, bevor sie mit dem Server sprechen kann - denken Sie an eine Notiz, die in ein Flugzeug geschrieben wurde, oder an eine optimistische Benutzeroberfläche, die die neue Zeile sofort anzeigt. Wenn der Client eine UUID im Voraus prägt, hat der Datensatz eine stabile Identität vom ersten Tastendruck an und synchronisiert sich später ohne Server-Rundumtrip zu & quot; Holen Sie sich eine ID." I' haben dies verwendet, um Formulare auch bei flockigen Verbindungen sofort angezeigt zu bekommen.
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/1040Und so weiter Das Eintauschen einer UUID beseitigt sowohl das geschäftsmetrische Leck als auch die einfache Aufzählung. Für alles, was ein Benutzer in einer URL sehen kann, lohnt sich dies - obwohl denken Sie daran, dass eine UUID kein Zugriffskontrollmechanismus ist; Sie benötigen immer noch echte Autorisierungsprüfungen dahinter.
Korrelations-IDs für die Verfolgung. Wenn eine einzelne Anfrage über fünf Mikrodienste hinweg gefächert wird, wird eine UUID als Korrelations-ID angehängt und bei jedem Hop protokolliert. & quot; Irgendwo in diesem Schlamassel ist etwas fehlgeschlagen" in eine einzige greppbare Zeichenfolge über alle Ihre Protokolle. Dies ist ein Ort, an dem selbst eine einfache v4 perfekt ist - Sie tun es #39; Sie müssen nicht bestellen, sondern 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 etwas eindeutig - eine Datenbankzeile, eine API-Ressource, eine Sitzung, eine hochgeladene Datei, eine Spur über Microservices hinweg - ohne dass ein zentraler Dienst zur Verteilung von IDs erforderlich ist. It's ist die Anlaufstelle, wann immer mehrere Systeme oder Clients unabhängig voneinander Identifikatoren erstellen müssen und dennoch sicher sein müssen, dass sie gewonnen werden & #39; t kollidieren. Sie können sofort eine mit der generieren 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 wird UUID v7 - it' s zeitbestimmt für eine effiziente Indizierung bei gleichzeitig global eindeutigem Verbleib, und it' s die aktuelle IETF-Empfehlung unter RFC 9562. Verwenden Sie v4, wenn es auf Unvorhersehbarkeit ankommt, wie z. B. Identifikatoren, die nicht erraten werden dürfen Vermeiden Sie v1 für neue Arbeiten, da es die erzeugende Maschine einbettet's MAC-Adresse.
Sind UUIDs sequentiell?
V1 und v7 sind zeitlich geordnet, daher sortieren später generierte IDs nach früheren; v4 ist völlig zufällig ohne Reihenfolge. Die sequentielle Reihenfolge macht v7 mit B-Baum-Indizes kompatibel - neue Zeilen hängen eher an als zu streuen Wenn Sie & #39; zufällige v4 als Primärschlüssel auf einer großen Tabelle verwenden, kann mangelnde Ordnung die Einfügungs- und Indexleistung 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-Speicher verschwendet 20 Bytes pro Zeile und verlangsamt jeden Vergleich, was sich auf großen Tischen schnell summiert.
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?
Ab v1, v6 und v7, ja - sie kodieren einen Zeitstempel. v7 speichert einen Millisekunden-Unix-Zeitstempel in seinen ersten 48 Bit, den Sie dekodieren und mit dem 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, an die Sie denken & #39; denken Sie nicht darüber nach, bis ein System an einer einzigen Datenbank vorbeiwä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 Client-Seite mit nichts hochgeladen Wenn Sie die Zeit innerhalb einer v7 lesen müssen, greifen Sie nach der Zeitstempelkonverter, und stöbern Sie den Rest der Codierungswerkzeuge- 600+ kostenlose Dienstprogramme - drüben bei Toolz.devdrohen



