Wikipedia · einfach zusammengefasst · Stand
Universally Unique Identifier
Eine UUID besteht aus einer Zahl mit 16-Bytes (128 Bits), die hexadezimal notiert und in fünf, mit Bindestrichen abgetrennten Gruppen, unterteilt wird. In …
Inhalt6 Abschnitte
Grundidee und Darstellung
Ein Universally Unique Identifier (UUID) ist eine 128-Bit-Zahl zur Identifikation von Informationen oder anderen Objekten in Computersystemen. Bei den standardisierten Erzeugungsverfahren kann eine UUID für praktische Zwecke als global eindeutig angesehen werden. Eine absolute Garantie gibt es nicht, weil Kollisionen – also doppelte Kennungen für verschiedene Objekte – theoretisch möglich sind. Ihre Wahrscheinlichkeit ist jedoch normalerweise so gering, dass sie vernachlässigt werden kann.
UUIDs sind besonders nützlich in verteilten Systemen: Jeder Beteiligte kann eine Kennung erzeugen, ohne eine zentrale Registrierungsstelle zu kontaktieren oder sich mit anderen Erzeugern abzustimmen. Dadurch lassen sich beispielsweise später Datenbanken zusammenführen, ohne Bezeichnerkonflikte auflösen zu müssen.
Eine UUID besteht aus 16 Bytes beziehungsweise 128 Bits. Sie wird meist hexadezimal in fünf durch Bindestriche getrennten Gruppen im Format 8-4-4-4-12 geschrieben, zum Beispiel 8be4df61-93ca-11d2-aa0d-00e098032b8c. In vielen Implementierungen wird die Zeichenkette zusätzlich in geschweifte Klammern gesetzt: {8be4df61-93ca-11d2-aa0d-00e098032b8c}. Die vier höchstwertigen Bits des dritten Blocks kennzeichnen die Version beziehungsweise den Subtyp; Bits im vierten Block kennzeichnen die UUID-Variante.
Der Genus von UUID und GUID ist im Deutschen nicht eindeutig festgelegt. Üblicher ist die weibliche Form „die UUID“ beziehungsweise „die GUID“, gelegentlich wird auch die männliche Form verwendet.
Standardisierung und grundlegende Versionen
UUIDs wurden zunächst von der Open Software Foundation (OSF) als Teil des Distributed Computing Environment (DCE) standardisiert. Sie sind unter anderem in ISO/IEC 11578:1996 „Information technology – Open Systems Interconnection – Remote Procedure Call (RPC)“ und als eigener Standard in ISO/IEC 9834-8:2005 dokumentiert. Die IETF veröffentlichte das auf UUIDs beruhende RFC 4122; aktuell werden UUIDs in RFC 9562 geregelt.
RFC 4122 beschreibt sechs wesentliche Felder des ursprünglichen Aufbaus: time_low mit 32 Bits, time_mid mit 16 Bits, time_hi_and_version mit 16 Bits, clock_seq_high_and_reserved und clock_seq_low für die Clocksequenz sowie node mit 48 Bits. Die Feldnamen stammen aus der ursprünglichen Version 1 und sind bei zufällig erzeugten UUIDs hauptsächlich von historischem Interesse.
Nach RFC 4122 sind folgende Versionen definiert:
- Version 1: ursprüngliche, zeitstempelbasierte UUID.
- Version 2: DCE Security version.
- Version 3: namensbasiert und mit MD5 gehasht.
- Version 4: zufällig oder pseudozufällig erzeugt.
- Version 5: namensbasiert und mit SHA-1 gehasht.
Die Versionsnummer ist streng genommen keine vollständige Version, sondern eine Kennzeichnung des UUID-Subtyps. Die heute verwendeten Varianten unterscheiden sich vor allem darin, ob sie Zeitstempel, Zufallswerte oder Hashwerte verwenden.
Zeitstempel und Zufallswerte
Bei zeitstempelbasierten UUIDs ist der Zeitstempel ein 60-Bit-Wert. Er zählt die seit dem 15. Oktober 1582, dem Datum der Einführung des heutigen Gregorianischen Kalenders, vergangenen 100-Nanosekunden-Intervalle. Eine Clock sequence verhindert Probleme, wenn die Systemzeit zurückgestellt wird: Sie soll dann entweder um 1 erhöht oder auf einen neuen pseudozufälligen Wert gesetzt werden. Die Node-ID soll die MAC-Adresse einer Netzwerkkarte sein; fehlt eine MAC-Adresse, darf ein pseudozufälliger Wert verwendet werden. Die Offenlegung von MAC-Adresse und Erzeugungszeitpunkt wurde kritisiert, weil dadurch der erzeugende Computer und der Zeitpunkt erkennbar sein können.
Bei Version 4 werden alle nicht durch das UUID-Format festgelegten Bits mit zufälligen oder pseudozufälligen Werten belegt. Es gibt 2^{122} mögliche zufällig generierbare UUIDs, ungefähr 5,3169 × 10^{36}. Voraussetzung für diese Aussage ist, dass der Zufallszahlalgorithmus gleichverteilte Zufallszahlen liefert. Die Zufallswerte sind bei GUIDs der Version 4 jedoch nicht kryptographisch sicher.
Version 6 behält das Bitlayout von Version 1 grundsätzlich bei, ordnet die Zeitstempelbits aber anders an, um die Erstellung zu vereinfachen. Der Zeitstempel zählt ebenfalls 100-Nanosekunden-Intervalle seit dem 15. Oktober 1582 um 00:00:00.00 UTC und wird auf time_high, time_mid und time_low verteilt. Das Versionsfeld ist 6 beziehungsweise 0110₂, das Variantenfeld ist 10₂. Die 14 Bits große clock_seq enthält die Clocksequenz; node kann je nach Implementierung Zufallswerte oder die MAC-Adresse enthalten.
Version 7 verbindet einen Zeitstempel mit Zufallsbits. Sie besteht aus einem 36-Bit-UNIX-Zeitstempel unixts in Big-Endian-Codierung, 12 Bits subsec_a, dem 4-Bit-Versionsfeld mit dem Wert 7 beziehungsweise 0111₂, weiteren 12 Bits subsec_b, dem 2-Bit-Variantenfeld 10₂ und 62 Zufallsbits subsec_seq_node. Der Zeitstempel ermöglicht eine Sortierung in Datenbanken, die Zufallsbits sollen Kollisionen vermeiden.
Namensbasierte UUIDs
Bei den Versionen 3 und 5 wird eine UUID aus einem Namen innerhalb eines bestimmten Namensraums erzeugt. Ein Name ist in diesem Namensraum ein eindeutiger Bezeichner für ein Objekt, eine Ressource oder etwas Vergleichbares. Zuerst wird eine Bytefolge aus der UUID des Namensraums und dem Namen gebildet. Diese Bytefolge wird mit MD5 bei Version 3 oder SHA-1 bei Version 5 gehasht. Anschließend wird der Hash nach festen Regeln auf die verfügbaren UUID-Bits verteilt.
RFC 4122 nennt beispielhafte Namensraum-UUIDs für DNS, URL, ISO OID und „X.500 Distinguished Names“.
Beispiel: Für den DNS-Namen www.example.org und Version 5 wird die DNS-Namensraum-UUID 6ba7b810-9dad-11d1-80b4-00c04fd430c8 mit der Bytefolge des Namens verknüpft. Der daraus berechnete SHA-1-Hash lautet 74738ff55367e9589aee98fffdcd187694028007. Nach dem Einsetzen der festgelegten Bits für Version und Variante lautet die UUID 74738ff5-5367-5958-9aee-98fffdcd1876. Gleiche Namen im gleichen Namensraum führen damit nach demselben Verfahren zu derselben Kennung.
Anwendungsspezifische UUIDs
UUIDv8 ist für experimentelle oder herstellerspezifische Anwendungen vorgesehen, wenn die anderen UUID-Versionen für eine bestimmte Anwendung nicht geeignet sind. Das Versionsfeld hat den Wert 8 beziehungsweise 1000₂. Zusätzlich gibt es ein 2 Bit großes Variantenfeld, mit dem verschiedene UUID-Implementierungen innerhalb einer Anwendung unterschieden werden können.
Empfohlen wird eine Zusammensetzung aus timestamp, also dem Erstellungszeitpunkt, clock sequence, einem Zählwert für mehrere UUIDs mit demselben Zeitstempel, und node. Für node können beispielsweise Zufallswerte, eine MAC-Adresse oder ein Hash-Code verwendet werden. Die einzelnen Felder dürfen bei UUIDv8 beliebige Längen haben; dadurch ist das Format anwendungsabhängig.
GUIDs, Squids und Implementierungen
Ein Globally Unique Identifier (GUID) ist ebenfalls eine 128-Bit-Zahl beziehungsweise 16 Bytes und stellt typischerweise eine Implementierung des UUID-Standards dar, besonders im Umfeld von Microsoft. GUIDs werden meist als XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX dargestellt. Jedes X ist eine Hexadezimalziffer von 0–9 oder A–F; die Darstellung enthält 32 Ziffern beziehungsweise Buchstaben und mit Bindestrichen 36 Zeichen. Ein Beispiel ist 936DA01F-9ABD-4D9D-80C7-02AF85C822A8. Die Version ist an der 4 im dritten Block erkennbar, die Variante an der 8 im vierten Block. Für dieselbe Variante können dort auch 9, A oder B stehen.
GUIDs der Version 1 beruhen auf MAC-Adresse und aktueller Uhrzeit. In der aktuellen Version 4 wird die MAC-Adresse nicht mehr verwendet, sodass Rückschlüsse auf den Erzeuger kaum möglich sind. Microsoft verwendet UUIDs beziehungsweise GUIDs unter anderem für Office-Dokumente, COM-Schnittstellen, Active-X-Steuerelemente sowie Datenträger- und Partitionstypen in der GUID Partition Table. Historische COM-UUIDs können eine eigene Variante besitzen; der GUID des IUnknown-Interfaces lautet beispielsweise 00000000-0000-0000-C000-000000000046.
Squids, früher HashID genannt, codieren Zahlen mit dem Zeichensatz [A-Za-z0-9]+ und eignen sich dadurch für URIs wie URLs. Die UUID 06637133-2230-472e-80fa-ba1c9661d0a7 kann beispielsweise als 0c3oKoWRCcmkvmMcfZeP1t dargestellt werden. Häufig wird jedoch eine Zuordnungstabelle zwischen einer UUID und einer eindeutigen Zahl verwendet. Die Zahl wird als Squid codiert und in der URI übertragen. So kann der Hexadezimalwert 07454566 als jkwuEpN8ujl codiert und in https://example.org/jkwuEpN8ujl verwendet werden.
Implementierungen gibt es unter anderem in der Windows API als GUID-Struktur, unter Linux in /proc/sys/kernel/random/uuid und unter FreeBSD als uuid(3). Beispiele aus Programmiersprachen und Bibliotheken sind java.util.UUID, Qt QUuid, .NET System.Guid, Rust uuid::Uuid und Python Lib/uuid.py. System.Guid implementiert UUIDv4; ab .NET 9 wird auch UUIDv7 unterstützt. Rust uuid::Uuid unterstützt UUIDs v1 bis v8.