Benötigen Sie einen Identifikator, der nicht mit einem kollidiert, den jemand anderes auf einer Maschine erstellt hat, von der Sie noch nie gehört haben, ohne jemanden um Erlaubnis zu fragen? Genau das ist die Aufgabe einer UUID. Es handelt sich um eine 128-Bit-Zahl, geschrieben als 36 Zeichen im bekannten 8-4-4-4-12-Muster, und ihr gesamtes Design zielt darauf ab, dass keine zwei gleich sind, obwohl niemand koordiniert, wer welche bekommt. Dieser kostenlose Generator erstellt sie in Ihrem Browser: Wählen Sie eine Version unter «Version», geben Sie unter «Anzahl» an, wie viele Sie benötigen, und drücken Sie auf «Generieren». Die Seite öffnet sich mit einer einzelnen v4, der Version, die die meisten Projekte benötigen, sodass der erste Identifikator nur einen Klick entfernt ist.
Jeder Identifikator wird in Ihrem Browser erstellt, und jeder zufällige Teil stammt aus der Web Crypto API. Die Version 4 verwendet crypto.randomUUID(), wo der Browser dies anbietet, und ansonsten crypto.getRandomValues() — eine kryptografisch starke Zufallsquelle anstelle einer pseudo-zufälligen JavaScript-Funktion wie Math.random(). Version 7 setzt hier einen 48-Bit-Millisekunden-Zeitstempel an den Anfang, dann einen 12-Bit-Zähler, der innerhalb derselben Millisekunde hochzählt, gefolgt von 62 zufälligen Bits — die Zählermethode, die RFC 9562 beschreibt, eines der darin erlaubten Layouts; dieser Zähler ist der Grund, warum ein Tausender-Stapel in der richtigen Reihenfolge und nicht gemischt ausgegeben wird. Version 1 kombiniert einen Zeitstempel mit einem zufälligen Knoten-Identifikator, bei dem das Multicast-Bit gesetzt ist, sodass er niemals die Adresse Ihrer Netzwerkkarte enthält, wie es die ursprünglichen Implementierungen aus den 1990er Jahren taten. Die Versionen 3 und 5 sind überhaupt nicht zufällig: Sie hashen einen Namespace zusammen mit einem Namen unter Verwendung von MD5 bzw. SHA-1, und dieses Hashing, ausgeführt durch den seiteneigenen MD5- und SHA-1-Code statt über Web Crypto, findet ebenfalls auf Ihrem Gerät statt. Ihre Identifikatoren werden niemals an unseren Server gesendet, sodass wir sie weder sehen noch protokollieren, und sobald die Seite geladen ist, funktioniert sie auch ohne Internetverbindung weiter.
«Version» ist das Feld, das alles andere entscheidet. Version 4 besteht aus 122 zufälligen Bits und hat keine Struktur — der Standard und die richtige Antwort, wenn ein Identifikator nur einzigartig sein muss. Version 7, wie sie hier erstellt wird, behält 62 zufällige Bits, beginnt jedoch mit dem Zeitpunkt ihrer Erstellung, sodass ein Stapel davon in der Reihenfolge seiner Entstehung sortiert wird; das macht sie zur Version der Wahl, wenn der Identifikator ein Datenbank-Schlüssel (primary key) werden soll. Version 1 ist das ursprüngliche zeitbasierte Schema, das hier für Systeme beibehalten wird, die noch danach verlangen. Die Versionen 3 und 5 sind das ungleiche Paar: Sie sind deterministisch, was bedeutet, dass dieselben Eingaben immer denselben Identifikator erzeugen, und sie erfordern zwei zusätzliche Felder — «Namespace», welches einer der Standardräume DNS, URL, OID und X.500 oder Ihr «Eigener Namespace (UUID)» ist, und «Name», die Zeichenfolge, die identifiziert wird. Wenn Sie v5 den URL-Namespace und https://example.com/a geben, erhalten Sie heute, morgen und auf der Maschine von jemand anderem dieselbe UUID. Aus diesem Grund verschwindet das Feld «Anzahl», wenn v3 oder v5 ausgewählt wird: Tausend Kopien eines deterministischen Wertes wären lediglich tausend Kopien ein und desselben deterministischen Wertes. Für jede andere Version reicht «Anzahl» von 1 bis 1000.
Vier Schalter ändern die Form der Ausgabe, ohne die zugrunde liegenden 128 Bits zu verändern. «Grossbuchstaben» druckt die hexadezimalen Ziffern in Versalien, «Ohne Bindestriche» liefert die kompakte 32-Zeichen-Form, die einige Spalten und Dateinamen bevorzugen, und «Geschweifte Klammern» umschliesst den Wert mit { } — die Art, wie Windows und .NET eine GUID üblicherweise schreiben. Unter «Erweiterte Optionen» fügt urn:uuid: das Präfix hinzu, das sie zu einer formellen URN macht; es schaltet «Geschweifte Klammern» und «Ohne Bindestriche» aus, während es aktiviert ist, da der Standard genau eine URN-Form erlaubt und dies die kanonische Form mit Bindestrichen ist. «Kopierformat» bestimmt, wie ein Stapel zusammengefügt wird, wenn Sie ihn entnehmen: einer pro Zeile, durch Kommas getrennt, oder jeder Wert in Anführungszeichen mit einem abschliessenden Komma, das direkt in ein Array im Code eingefügt werden kann. Unter dem Ergebnis befindet sich eine Zeile, die die Zufälligkeit in Bits angibt — 122 für v4, 62 für v7 — und für v7 den Zeitstempel, der im ersten Identifikator des Stapels kodiert ist, sodass die Zeit innerhalb des Wertes sichtbar ist und nicht nur impliziert wird. «Alles kopieren» und «Als Datei speichern» berücksichtigen beide «Kopierformat». «Verlauf» speichert Ihre letzten 10 Stapel in Ihrem eigenen Browser: Klicken Sie auf einen, um ihn zurückzuholen, kopieren oder löschen Sie einen einzelnen Eintrag oder löschen Sie alles. «Löschen» leert das Ergebnis und lässt Ihre Einstellungen in Ruhe, und ab 50 Identifikatoren wird die Liste zu einem einzigen scrollbaren Block anstelle von fünfzig Zeilen.
Das Folgenreichste auf dieser Seite ist der Unterschied zwischen v4 und v7 als Primärschlüssel (primary key), und das ist keine Geschmacksache. Die meisten Datenbank-Indizes sind B-Trees, die in sortierter Reihenfolge gehalten werden, und wo ein neuer Schlüssel in dieser Reihenfolge landet, entscheidet, wie viel Arbeit das Einfügen kostet. Ein v4-Schlüssel ist zufällig, sodass aufeinanderfolgende Einfügungen in unzusammenhängenden Ecken des Index landen: Seiten, die voll waren, werden aufgeteilt (page split), die Teile des Baums, die die Datenbank im Speicher hält, sind selten die Teile, die das nächste Einfügen benötigt, und der Index wächst langsamer und wird stärker fragmentiert, als die Zeilen, auf die er zeigt, es rechtfertigen. Ein v7-Schlüssel beginnt mit der aktuellen Millisekunde, sodass aufeinanderfolgende Einfügungen am rechten Rand des Baums nebeneinander landen, ähnlich wie es ein automatisch inkrementierender Integer tut. Wie viel das bringt, hängt von der Datenbank, ihren Indizes und der Arbeitslast ab, aber das ist der Kompromiss: v7 bringt das Einfügemuster eines sequenziellen Schlüssels mit sich, während die Eigenschaft erhalten bleibt, weshalb Sie sich überhaupt für UUIDs entschieden haben, nämlich dass jeder eine prägen kann, ohne einen Server fragen zu müssen. Der Preis dafür ist, dass die Erstellungszeit nun innerhalb des Identifikators lesbar ist, und ob das eine Rolle spielt, ist eine Frage Ihrer Daten, nicht des Formats.
Nichts prüft je eine UUID auf Einzigartigkeit; ihre Grösse ist die Garantie. Es gibt keine Registrierung, keinen Server-Round-Trip, kein Nachschlagen — ein Generator erzeugt eine Zahl und händigt sie aus, und der Grund, warum zwei von ihnen nicht kollidieren, ist einfach, dass es 2^122 mögliche v4-Werte gibt, etwa 5,3 Sextillionen. Das Geburtstagsparadoxon (birthday problem) ist der ehrliche Weg, das einzuordnen: Sie bräuchten etwa 2,7 Trillionen Identifikatoren, bevor die Chance, dass zwei davon übereinstimmen, fifty-fifty stünde, was einer Milliarde neuer UUIDs pro Sekunde für 86 Jahre entspricht. Es lohnt sich, präzise zu sein, was das verspricht und was nicht. Es ist eine statistische Garantie, keine arithmetische, und sie gilt nur, solange die zugrunde liegende Zufälligkeit echt ist — ein schlecht initialisierter Generator oder eine virtuelle Maschine, die zusammen mit ihrem Entropiepool geklont wird, bricht sie auf eine Weise, die das Format nicht erkennen kann. Version 7 schränkt die Frage weiter ein: Innerhalb eines einzigen Stapels kann dieser Generator einen Wert überhaupt nicht wiederholen, da der Zähler hochzählt statt zu würfeln, und über unabhängige Generatoren hinweg erledigen die 62 zufälligen Bits die Arbeit.
Eine UUID ist ein Identifikator, kein Passwort. Version 4 ist unvorhersehbar, und das verleitet dazu, sie als Geheimnis zu behandeln — als Link zum Zurücksetzen des Passworts, als nicht zu erratende URL, als Sitzungs-Token, als API-Schlüssel. Die Unvorhersehbarkeit ist real, aber Geheimhaltung ist eine Eigenschaft davon, wie ein Wert gehandhabt wird, und Identifikatoren werden absichtlich nachlässig gehandhabt: Sie sitzen in URLs, die im Browserverlauf, in Serverprotokollen, Referrer-Headern und Analysen landen und in Chat-Nachrichten kopiert werden, was unter dem Schweizer Datenschutzgesetz (DSG) ein Risiko darstellt, wenn sie als Geheimnisse dienen. Die anderen Versionen sind noch schlechtere Kandidaten. Sowohl Version 1 als auch Version 7 kodieren den Moment der Erstellung, sodass jeder, der eine hat, ungefähr weiss, wann sie erstellt wurde, und die Umgebung von allem eingrenzen kann, was daneben erstellt wurde. Die Versionen 3 und 5 sind absichtlich deterministisch: Eine v5 UUID einer E-Mail-Adresse ist kein gehashtes Geheimnis, sondern ein Wert, den jeder mit derselben Adresse in einer Sekunde berechnen kann. Verwenden Sie eine UUID, um ein Ding zu benennen. Verwenden Sie einen Passwort-Generator oder einen Token aus einer Bibliothek für Geheimnisse, wenn der Wert unbekannt bleiben muss.
Warum diesen UUID Generator wählen?
- Generierung nur im Browser: Identifikatoren werden auf Ihrem Gerät erstellt und nie an unseren Server gesendet
- Zufälligkeit der Web Crypto API: Kryptografisch sicher, nicht Math.random()
- Fünf Versionen an einem Ort: v1, v3, v4, v5 und v7, ohne das Werkzeug wechseln zu müssen
- Echt geordnete v7: Ein Zähler innerhalb der Millisekunde, wie in RFC 9562 beschrieben
- Deterministische v3 und v5 mit den vier Standard-Namespaces oder Ihrem eigenen
- Bis zu 1000 auf einmal, mit einer kompakten scrollbaren Liste ab fünfzig
- Jede gängige Form: mit Bindestrich, blank, Grossbuchstaben, in Klammern oder eine urn:uuid: URN
- Kopieren als Zeilen, Kommas oder Werte in Anführungszeichen, die direkt in Code eingefügt werden können
- Unbegrenzt und kostenlos: Keine Anmeldung, keine Nutzungslimits, nichts auf unseren Servern
UUIDs tauchen überall dort auf, wo etwas benannt werden muss, bevor irgendetwas bestätigen kann, dass der Name frei ist. Anwendungscode prägt sie für Zeilen, die er gleich einfügen wird, sodass das Objekt eine Identität hat, bevor es jemals die Datenbank erreicht hat, und ein Client darauf verweisen kann, während der Schreibvorgang noch läuft. Verteilte Systeme stützen sich noch stärker auf sie: Mehrere Dienste, die in dieselbe Tabelle schreiben, ein mobiler Offline-Client, der Datensätze in einem Flugzeug erstellt, eine Warteschlange, die die bereits verarbeitete Nachricht erkennen muss — keines dieser Systeme kann warten, bis es an der Reihe für einen gemeinsamen Zähler ist. Version 5 deckt einen anderen Bedarf ab, nämlich einen stabilen Identifikator, der von etwas abgeleitet ist, das Sie bereits haben: Dasselbe Dokument, dieselbe URL oder dasselbe Konto wird immer auf dieselbe UUID abgebildet, sodass ein Import, der Datensätze über diesen Identifikator abgleicht, zweimal ausgeführt werden kann, ohne etwas zu duplizieren. Anderswo sind sie einfach das Format, das ein System verlangt — ein kantonales digitales Service, das Meldungen verarbeitet, eine Bank in Zürich, die Kundendaten konsolidiert, ein Pharmaunternehmen in Basel, dessen Feldgeräte synchronisieren, wenn sie wieder Empfang haben, oder ein landesweites Unternehmen, das mehrere Sprachregionen aus derselben Codebasis bedient.
Es lohnt sich, einige ehrliche Grenzen zu kennen. Ein Stapel bedeutet eine Version: Der Wert in «Version» gilt für alles darin, also sind ein Durchlauf von v4 und ein Durchlauf von v7 zwei Stapel. Dies ist ein Generator, kein Inspektor — das Einfügen einer UUID, um ihre Version oder ihren Zeitstempel auszulesen, ist nichts, was diese Seite tut. «Als Datei speichern» schreibt eine reine Textdatei anstelle von CSV oder JSON. Version 7 gibt offen preis, wann sie erstellt wurde, bis auf die Millisekunde, was ein echter Kompromiss und kein Fehler ist, und Version 1 lässt die Zeit auf die gleiche Weise durchsickern; wenn das ein Problem für Ihre Daten ist, ist Version 4 die Version, die niemandem etwas verrät. Zwei spezielle Werte aus dem Standard sind keine Versionen und daher keine Optionen in «Version», aber Sie können sie von hier kopieren: die nil UUID, 00000000-0000-0000-0000-000000000000, und die max UUID, ffffffff-ffff-ffff-ffff-ffffffffffff. Alles auf dieser Seite folgt RFC 9562, der Spezifikation, die RFC 4122 im Jahr 2024 abgelöst hat, sodass die Ausgabe standardmässiger UUID-Text ist, den Bibliotheken und Datenbanken lesen — auch wenn eine bestimmte API möglicherweise nur bestimmte Versionen oder eine bestimmte Schreibweise akzeptiert. Innerhalb dieser Grenzen ist die Garantie stark: Jeder Identifikator wird nach dem Standard auf Ihrer eigenen Maschine erstellt und niemals an unseren Server gesendet, und jeder zufällige Teil stammt aus einer kryptografisch sicheren Quelle.