Zum Inhalt springen

„Universally Unique Identifier“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Manski83 (Diskussion | Beiträge)
K Klammer gesetzt
tk k
 
(145 dazwischenliegende Versionen von 93 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Ein '''Universally Unique Identifier''' ('''UUID''') ist ein Standard für Identifikatoren, der in der [[Software]]entwicklung verwendet wird. Er ist von der [[Open Software Foundation]] (OSF) als Teil des [[Distributed Computing Environment]] (DCE) standardisiert. Die Absicht hinter UUIDs ist, Informationen in verteilten Systemen ohne zentrale Koordination eindeutig kennzeichnen zu können.
Ein '''Universally Unique Identifier''' ('''UUID''') ist eine 128-[[Bit]]-Zahl, welche zur Identifikation von Informationen in [[Computersystem]]en verwendet wird. Der Ausdruck '''Globally Unique Identifier''' ('''GUID''') wird ebenfalls benutzt, typischerweise im Zusammenhang mit [[Microsoft]] (z. B. Software, [[Registrierungsdatenbank|Registry]]).


Bei der Generierung nach den Standardmethoden können UUIDs für praktische Zwecke als global eindeutig angenommen werden. Obwohl die Wahrscheinlichkeit, dass ein UUID dupliziert wird, nicht null ist, ist sie so gering, dass die [[Kollisionsresistenz|Wahrscheinlichkeit für eine Kollision]] zumeist vernachlässigbar ist. Ein Vorteil von UUIDs ist die – im Gegensatz zu den meisten anderen [[Nummerung|Nummerierungsschemata]] – Unabhängigkeit von einer zentralen Registrierungsstelle oder Koordinierung zwischen den Parteien.
Ein UUID besteht aus einer 16-[[Byte]]-Zahl, die hexadezimal notiert und in fünf Gruppen unterteilt wird. In ihrer Normalform sieht eine UUID beispielsweise so aus:


Daher kann jeder einen UUID erstellen und ihn zur Identifizierung eines Objekts verwenden und dabei mit größtmöglicher Sicherheit davon ausgehen, dass die Kennung keine andere Kennung dupliziert, die bereits erstellt wurde oder in Zukunft zur Identifizierung eines anderen Objekts erstellt wird.
:550e8400-e29b-11d4-a716-446655440000

Die Verwendung von UUIDs und GUIDs ist weit verbreitet. Viele Computerplattformen bieten Unterstützung beim Generieren und Parsen ihrer Textdarstellung.

Er wurde von der [[Open Software Foundation]] (OSF) als Teil des [[Distributed Computing Environment]] (DCE) standardisiert und ist jetzt in <nowiki>RFC&nbsp;4122</nowiki><ref name="rfc4122" /> geregelt.

Ein UUID besteht aus einer 16-[[Byte]]-Zahl, die [[hexadezimal]] notiert und in fünf Gruppen unterteilt wird. In seiner Normalform sieht ein UUID beispielsweise so aus:

<pre style="margin-left:2em">
550e8400-e29b-11d4-a716-446655440000
</pre>

== Geschichte und Standardisierung ==

UUID sind als Teil des Standards [[International Organization for Standardization|ISO]]/[[International Electrotechnical Commission|IEC]] 11578:1996 “Information technology – Open Systems [[Interconnection]] – [[Remote Procedure Call]] (RPC)” und als separater Standard ISO/IEC 9834-8:2005 dokumentiert. Die [[Internet Engineering Task Force|IETF]] hat das auf UUID basierende <nowiki>RFC&nbsp;4122</nowiki><ref name="rfc4122" /> veröffentlicht.

Das originale (Version 1) Generierungsschema für UUID war, die UUID-Version mit der [[MAC-Adresse]] des Computers, der den UUID generiert, und der Anzahl der 100-[[Nanosekunde]]n-Intervalle seit Beginn des [[Gregorianischer Kalender|Gregorianischen Kalenders]] aneinanderzuhängen. In der Praxis ist der eigentliche Algorithmus komplizierter. Dieses Schema wurde kritisiert, weil es sowohl die Identität des generierenden Computers als auch den Zeitpunkt der Generierung preisgibt.

Mehrere andere Algorithmen zur Generierung wurden entwickelt und flossen in den Standard ein, so ein Schema, welches nur auf [[Zufallszahl]]en basiert (Version 4 UUID), und Schemata, in denen der UUID aus einem beliebigen String (z.&nbsp;B. [[Domain Name System|DNS]]-Eintrag, [[Uniform Resource Locator|URL]], ISO [[Object Identifier|OID]], „[[X.500]] Distinguished Names“, aber auch jeder beliebigen anderen Semantik, sofern ein Basis-UUID dafür definiert wird) über [[Message-Digest Algorithm 5|MD5]]- (Version 3 UUID) oder [[SHA-1]]- (Version 5 UUID) [[Hashwert]]e hergeleitet wird.

Das Release 5.0 von [[Java (Programmiersprache)|Java]] stellt eine [[Objektorientierte Programmierung|Klasse]] zur Verfügung, die 128 Bit breite UUID generiert. Die API-Dokumentation für die Klasse <code>java.util.UUID</code><ref name="docs/api/java" /> verweist auf <nowiki>RFC&nbsp;4122</nowiki>.<ref name="rfc4122" /> Auch viele andere Sprachen stellen fertige Routinen zur Generierung von UUID bereit.


== Aufbau ==
== Aufbau ==
RFC 4122 beschreibt den Aufbau einer UUID. Die Namen der einzelnen Felder orientieren sich an der ursprünglichen UUID-Version 1 und sind bei den heute vorwiegend verwendeten zufällig generierten UUIDs nur noch von historischem Interesse.
<nowiki>RFC&nbsp;4122</nowiki><ref name="rfc4122" /> beschreibt den Aufbau eines UUID. Die Namen der einzelnen Felder orientieren sich an der ursprünglichen UUID-Version&nbsp;1 und sind bei den heute vorwiegend verwendeten zufällig generierten UUIDs nur noch von historischem Interesse.


:{| class="wikitable"
{| class="wikitable"
|+ Aufbau einer UUID nach RFC 4122
|+ Aufbau einer UUID nach <nowiki>RFC&nbsp;4122</nowiki><ref name="rfc4122" />
|-
! Offset !! Feldname !! Datentyp !! Beschreibung
! Offset !! Feldname !! Datentyp !! Beschreibung
|-
|-
| 0 || time_low || uint32_t || Zeitstempel, niederwertigste 32 Bits
| 0 || time_low || uint32_t || Zeitstempel, niederstwertige 32 Bits
|-
|-
| 4 || time_mid || uint16_t || Zeitstempel, mittlere 16 Bits
| 4 || time_mid || uint16_t || Zeitstempel, mittlere 16 Bits
|-
|-
| 6 || time_hi_and_version || uint16_t || Oberste Bits des Zeitstempels in den unteren 12 Bits des Feldes, die oberen 4 Bits dienen als Versionsbezeichner
| 6 || time_hi_and_version || uint16_t || Oberste Bits des Zeitstempels in den unteren 12 Bits des Feldes, die oberen 4 Bits dienen als Versionsbezeichner
|-
|-
| 8 || clock_seq_high_and_reserved || uint8_t || Oberste 6 Bits der Clocksequenz (die obersten 2 Bits des Feldes sind in der hier beschriebenen UUID-Variante stets <tt>1 0</tt>)
| 8 || clock_seq_high_and_reserved || uint8_t || Oberste 6 Bits der Clocksequenz (die obersten 2 Bits des Feldes sind in der hier beschriebenen UUID-Variante stets <code>1 0</code>)
|-
|-
| 9 || clock_seq_low || uint8_t || Untere 8 Bits der Clocksequenz
| 9 || clock_seq_low || uint8_t || Untere 8 Bits der Clocksequenz
|-
|-
| 10 || node || uint48_t || Eindeutige Node-Identifikationsnummer
| 10 || node || uint48_t || Eindeutige Node-Identifikationsnummer
|}
|}


Das zugehörige [[Bitfelddiagramm]] sieht wie folgt aus:
Die obersten 4 Bits im Feld <tt>time_hi_and_version</tt> geben dabei die sogenannte ''Version'' der UUID an. Strenggenommen ist dies keine Version, sondern eine Art UUID-Subtyp. Folgende 5 Versionen sind bisher definiert worden:
<pre>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid |version| time_hi |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</pre>


Die obersten vier Bits im Feld <code>time_hi_and_version</code> geben dabei die sogenannte ''Version'' des UUID an. Strenggenommen ist dies keine Version, sondern eine Art UUID-Subtyp. Folgende 5 Versionen sind bisher definiert worden:
:{| class="wikitable"

|+ UUID-Versionen nach RFC 4122
{| class="wikitable"
|+ UUID-Versionen nach <nowiki>RFC&nbsp;4122</nowiki><ref name="rfc4122" />
|-
! Version !! Beschreibung
! Version !! Beschreibung
|-
|-
| 1 || ursprüngliche, zeitstempelbasierte UUID
| 1 || ursprünglicher, zeitstempelbasierter UUID
|-
|-
| 2 || DCE Security version
| 2 || DCE Security version
|-
|-
| 3 || namensbasiert, [[MD5]]-gehasht
| 3 || namensbasiert, [[Message-Digest Algorithm 5|MD5]]-gehasht
|-
|-
| 4 || zufällig oder pseudozufällige UUID
| 4 || zufälliger oder pseudozufälliger UUID
|-
|-
| 5 || namensbasiert, [[SHA1]]-gehasht
| 5 || namensbasiert, [[SHA1]]-gehasht
|}
|}


Darüber hinaus wird die Einführung von weiteren Versionsnummern diskutiert, wie in folgender Tabelle mit Stand im Jahr 2022 dargestellt.<ref name="uuidnew1">{{Internetquelle |url=https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format |titel=New UUID Formats, draft-peabody-dispatch-new-uuid-format-04 |datum=2022-06-23 |abruf=2022-06-30}}</ref>

{| class="wikitable"
|+ Vorschläge zu neuen UUID-Versionen<ref name="uuidnew1" />
|-
! Version !! Beschreibung
|-
| 6 || zeitstempelbasierend wie Version 1, aber mit anderer Anordnung der Datenfelder
|-
| 7 || zeitstempelbasierend auf der [[Unixzeit]] mit zufälliger oder pseudozufälliger Komponente<ref>[https://www.ietf.org/archive/id/draft-ietf-uuidrev-rfc4122bis-07.html#name-uuid-version-7 ietf.org]</ref>
|-
| 8 || für experimentelle oder herstellerspezifische Anwendungen
|}


=== Zeitstempelbasierte UUIDs ===
=== Zeitstempelbasierte UUIDs ===
Der Zeitstempel ist ein 60-Bit-Wert, der die seit dem 15. Oktober 1582 (Einführung des heutigen [[Gregorianischer Kalender|Gregorianischen Kalenders]]) vergangenen 100-ns-Intervalle zählt. Um die Zeitstempel eindeutig zu halten, falls die Systemzeit mal zurückgestellt werden muss, existiert ein Feld "Clock sequence", welches in diesem Fall entweder um 1 erhöht wird oder auf einen neuen (pseudo)zufälligen Wert gesetzt werden soll.
Der Zeitstempel ist ein 60-Bit-Wert, der die seit dem 15. Oktober 1582 (Einführung des heutigen [[Gregorianischer Kalender|Gregorianischen Kalenders]]) vergangenen 100-ns-Intervalle zählt. Um die Zeitstempel eindeutig zu halten, falls die Systemzeit einmal zurückgestellt werden muss, gibt es ein Feld ''Clock sequence'', welches in diesem Fall entweder um 1 erhöht wird oder auf einen neuen (pseudo)zufälligen Wert gesetzt werden soll. Die Node-ID soll die [[MAC-Adresse]] einer der im System verbauten Netzwerkkarten sein oder ein pseudozufälliger Wert, falls das System keine MAC-Adresse besitzt.<ref name="Time-based UUID">{{Internetquelle |url=https://www.famkruithof.net/guid-uuid-timebased.html |titel=Time-based UUID / GUID |sprache=en |abruf=2023-06-23}}</ref>
Die Node-ID soll die [[MAC-Adresse]] einer der im System verbauten Netzwerkkarten sein oder ein pseudozufälliger Wert, falls das System keine MAC-Adresse besitzt.


=== (Pseudo)zufällig generierte UUIDs (Version 4) ===
=== (Pseudo)zufällig generierte UUIDs (Version 4) ===
Hierbei werden sämtliche Bits, die nicht vom UUID-Format auf feste Werte gesetzt werden, durch (pseudo-)zufällige Werte besetzt.
Hierbei werden sämtliche Bits, die nicht vom UUID-Format auf feste Werte gesetzt werden, durch (pseudo-)zufällige Werte besetzt.


Obwohl die Eindeutigkeit für eine so generierte UUID nicht garantiert ist, ist die Gesamtzahl der zufällig generierten UUIDs mit <math>2^{122} \approx 5{,}3169 \cdot 10^{36}</math> so groß, dass die Wahrscheinlichkeit der Erzeugung zweier gleicher UUIDs sehr klein ist, sofern die verwendeten Zufallszahlenalgorithmen gleichverteilte Zufallszahlen liefern. Daher können UUIDs beliebig ohne zentrales Kontrollorgan erzeugt und zur Kennzeichnung eingesetzt werden, ohne relevante Gefahr zu laufen, dass dieselbe UUID für etwas anderes verwendet wird. Mit UUID markierte Informationen können somit später in einer einzigen Datenbank zusammengeführt werden, ohne Bezeichnerkonflikte auflösen zu müssen.
Obwohl die Eindeutigkeit für einen so generierten UUID nicht garantiert ist, ist die Gesamtzahl der zufällig generierbaren UUIDs mit 2<sup>122</sup> 5,3169 × 10<sup>36</sup> so groß, dass die Wahrscheinlichkeit der Erzeugung zweier gleicher UUIDs sehr klein ist, sofern die verwendeten Zufallszahlenalgorithmen gleichverteilte Zufallszahlen liefern. Daher können UUIDs beliebig ohne zentrales Kontrollorgan erzeugt und zur Kennzeichnung eingesetzt werden, ohne relevante Gefahr zu laufen, dass derselbe UUID für etwas anderes verwendet wird. Mit UUID markierte Informationen können somit später in einer einzigen Datenbank zusammengeführt werden, ohne Bezeichnerkonflikte auflösen zu müssen.

Beispiele für Implementierung des UUID-Standards sind [[Microsoft]]s [[Globally Unique Identifier]] (GUID) und die Klasse <tt>java.util.UUID</tt> in der [[Java (Programmiersprache)|Java]] [[Programmierschnittstelle|API]].


=== Namensbasierte UUIDs (Version 3 und 5) ===
=== Namensbasierte UUIDs (Version 3 und 5) ===


Hierbei wird ausgehend von einem nicht näher bestimmten Namen eine UUID generiert. Namen sind innerhalb eines zugewiesenen Namensraum eindeutige Bezeichner für ein Objekt, eine Ressource oder Ähnliches. Ausgehend von einer UUID für den Namensraum wird aus dem Namen eine UUID generiert, indem eine Bytesequenz aus der Namensraum-UUID und dem Namen selbst gebildet wird und diese Bytesequenz dann mit MD5 oder SHA1 gehasht wird. Der Hash wird dann auf definierte Weise auf die verfügbaren UUID-Bits verteilt.
Hierbei wird ausgehend von einem nicht näher bestimmten Namen ein UUID generiert. Namen sind innerhalb eines zugewiesenen Namensraums eindeutige [[Bezeichner]] für ein Objekt, eine Ressource oder Ähnliches. Ausgehend von einem UUID für den Namensraum wird aus dem Namen ein UUID generiert, indem eine Bytesequenz aus der Namensraum-UUID und dem Namen selbst gebildet wird und diese Bytesequenz dann mit MD5 oder SHA1 gehasht wird. Der Hash wird dann auf definierte Weise auf die verfügbaren UUID-Bits verteilt.


RFC 4122 enthält beispielhafte Namensraum-UUIDs für die Namensräume [[Domain Name System|DNS]], [[Uniform Resource Locator|URL]], ISO [[Object Identifier|OID]] und "[[X.500]] Distinguished Names".
<nowiki>RFC&nbsp;4122</nowiki><ref name="rfc4122" /> enthält beispielhafte Namensraum-UUIDs für die Namensräume [[Domain Name System|DNS]], [[Uniform Resource Locator|URL]], ISO [[Object Identifier|OID]] und [[X.500]] Distinguished Names“.


Soll beispielsweise aus dem DNS-Namen <code>www.example.org</code> eine UUID-Version 5 generiert werden, so ist wie folgt vorzugehen:
Soll beispielsweise aus dem DNS-Namen <code>www.example.org</code> ein UUID-Version 5 generiert werden, so ist wie folgt vorzugehen:


# Namespace-UUID für "DNS"-Namen ist 6ba7b810-9dad-11d1-80b4-00c04fd430c8.
# Namespace-UUID für „DNS“-Namen ist 6ba7b810-9dad-11d1-80b4-00c04fd430c8.
# Daraus bildet man folgende Bytesequenz (Bytes von der Namespace-UUID in fett):<br />'''<tt>0x6b 0xa7 0xb8 0x10 0x9d 0xad 0x11 0xd1 0x80 0xb4 0x00 0xc0 0x4f 0xd4 0x30 0xc8</tt>''' <tt>0x77 0x77 0x77 0x2e 0x65 0x78 0x61 0x6d 0x70 0x6c 0x65 0x2e 0x63 0x6f 0x6d</tt>.
# An diese Bytefolge wird die Bytefolge für den Namen <code>www.example.org</code> angehängt (Bytes vom Namespace-UUID in fett):<br />'''<code>0x6b 0xa7 0xb8 0x10 0x9d 0xad 0x11 0xd1 0x80 0xb4 0x00 0xc0 0x4f 0xd4 0x30 0xc8</code>''' <code>0x77 0x77 0x77 0x2e 0x65 0x78 0x61 0x6d 0x70 0x6c 0x65 0x2e 0x6f 0x72 0x67</code>.
# Diese Bytesequenz ist mit SHA1 zu hashen. Das Ergebnis ist folgender SHA1-Hash: 2ed6657de927468b55e12665a8aea6a22dee3e35
# Diese Bytesequenz ist mit SHA1 zu hashen. Das Ergebnis ist folgender SHA1-Hash: 74738ff55367e9589aee98fffdcd187694028007
# Die Bits des SHA1-Hashes sind auf die verfügbaren Bits der UUID-Version 5 aufzuteilen.
# Die Bits des SHA1-Hashes sind auf die verfügbaren Bits der UUID-Version 5 aufzuteilen.
# Generierte UUID: 353e332d-a2a6-'''5'''8ae-'''A'''526-e1558b4627e9. (Die fett markierten Stellen enthalten feste Bits aus UUID-Variante und -Version.)
# Generierter UUID: 74738ff5-5367-'''5'''958-'''9'''aee-98fffdcd1876. (Die fett markierten Stellen enthalten feste Bits aus UUID-Variante und -Version.)


=== Zeitstempelbasierte UUIDs (Version 6) ===
== Geschichte und Standardisierung ==

UUID sind als Teil des Standards [[International Organization for Standardization|ISO]]/[[International Electrotechnical Commission|IEC]] 11578:1996 “Information technology – Open Systems Interconnection – Remote Procedure Call (RPC)” und als separater Standard ISO/IEC 9834-8:2005 dokumentiert. Die [[Internet Engineering Task Force|IETF]] hat das auf UUID basierende RFC 4122 veröffentlicht.
UUIDv6 zielt darauf ab, die Implementierung der UUID Erstellung zu vereinfachen, indem das Bitlayouts von UUIDv1 wiederverwendet wird, jedoch mit Änderungen in der Bitreihenfolge für den Zeitstempel.

# Der Zeitstempel zählt in 100 Nanosekunden-Intervallen ab dem 15. Oktober 1582 um 00:00:00.00 UTC und wird auf die Felder <code>time_high</code>, <code>time_mid</code>, und <code>t time_low</code> aufgeteilt.
# Das Feld <code>ver</code> wird immer auf die Versionsnummer (6 bzw. 0110<sub>b</sub>) gesetzt.
# Das Feld <code>var</code> wird gesetzt auf 10<sub>b</sub> gesetzt.
# Das Feld <code>clock_seq</code>, 14 Bits, enthält die Clocksequenz.
# Die <code>node</code>-Felder können –&nbsp;je nach Implementierung&nbsp;– entweder Zufallswerte enthalten, oder die MAC-Adresse des erstellenden Computers.<ref>{{RFC-Internet |RFC=9562 |Titel=Universally Unique IDentifiers (UUIDs) |Datum=2024-05}}</ref>

<pre>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | ver | time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| clock_seq | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</pre>

=== Zeitstempel + Zufallszahl basierte UUIDs (Version 7) ===

UUIDs der Version 7 bestehen aus<ref>{{Internetquelle |autor=BGP. Peabody, K. Davis |url=https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-02#name-uuidv7-layout-and-bit-order |titel=New UUID Formats |hrsg=[[Internet Engineering Task Force|IETF]] |datum=2022-04-10 |sprache=en |abruf=2024-07-13}}</ref>
# <code>unixts</code>: einem 36 Bit [[Unixzeit|UNIX-Zeitstempel]] (Big-Endian codiert)
# <code>subsec_a</code>12 Bits für Sekundenbruchteile
# <code>ver</code>: 4 Bit Versionsnummer (immer auf dem Wert 7 bzw. 0111<sub>b</sub> gesetzt)
# <code>subsec_b</code>: 12 Bits für Sekundenbruchteile
# <code>var</code>: 2 Bits für die UUID Variante (immer 10<sub>b</sub>)
# <code>subsec_seq_node</code>: 62 Zufallsbits

<pre>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unixts |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|unixts | subsec_a | ver | subsec_b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| subsec_seq_node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| subsec_seq_node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</pre>

Durch den Zeitstempel wird eine Sortierung in [[Datenbank]]en ermöglicht, während durch die Zufallsbits Kollisionen vermieden werden.

=== Anwendungsspezifische UUIDs (Version 8) ===

Eine UUIDv8 besitzt im Feld <code>ver</code> den Wert 8 bzw. 1000<sub>b</sub> und können verwendet werden, wenn andere UUID Versionen nach [RFC4122] für eine bestimmte Anwendung nicht geeignet sind. Zudem ist ein 2 Bit großes <code>variant</code> Feld definiert, um verschiedene UUID-Implementierungen innerhalb einer Anwendung unterscheiden zu können.

Es wird empfohlen, dass eine UUIDv8 aus <code>timestamp</code> (Zeitstempel der Erstellung), <code>clock sequence</code> (Zählwert, der sich erhöht, wenn mehrere UUIDs für denselben Zeitstempel erstellt werden), und <code>node</code> Felder (Zufallswerte, MAC-Adresse, Hash-Code etc.) bestehen. Diese Felder können hierbei eine beliebige Länge aufweisen.

Das folgende Schema zeigt auf, wie eine UUIDv8 implementiert sein kann:

<pre>
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp_32 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp_48 | ver | time_or_seq |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| seq_or_node | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</pre>

== {{Anker|GUID}} Globally Unique Identifier ==
Ein ''Globally Unique Identifier'' ist eine Zahl mit 128 [[Bit]] (16 [[Byte]]s), die in [[Verteiltes System|verteilten Computersystemen]] zum Einsatz kommt. GUID stellt eine Implementierung des Universally-Unique-Identifier-Standards (UUID) dar.

GUIDs werden üblicherweise im 8-4-4-4-12 Format ''XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'' dargestellt, wobei jedes ''X'' für ein Zeichen aus dem [[Hexadezimalsystem]] steht und damit eine Ziffer 0–9 oder ein Buchstabe A–F sein kann, z.&nbsp;B. ''936DA01F-9ABD-4D9D-80C7-02AF85C822A8'' (32 Buchstaben/Ziffern, mit Bindestrichen 36 Zeichen).

Die vier höchstwertigen Bits des dritten Blocks (von links aus gezählt) geben die Version der GUID an, aus der man auf die Art des verwendeten Algorithmus zur Erzeugung der GUID schließen kann. Die bis zu drei höchstwertigen Bits des vierten Blocks identifizieren die verwendete Variante. Im Beispiel ist die Version an der 4 erkennbar und die Variante an der 8 in 936DA01F-9ABD-'''4'''D9D-'''8'''0C7-02AF85C822A8. Dieselbe Variante wie im Beispiel könnte statt durch eine 8 auch durch eine&nbsp;9, ein A oder B gekennzeichnet sein, da für diese Variante nur die ersten beiden Bit zählen.<ref name="rfc4122" />

Eine denkbare Möglichkeit, einen eindeutigen Bezeichner zu erhalten, wäre die Zuteilung durch eine zentrale Registraturstelle. Für Computer-[[Netzwerkkarte]]n gibt es bereits eine solche zentrale Registraturstelle für die zugrunde liegenden [[MAC-Adresse]]n. Geht man davon aus, dass ein Computer zu einem Zeitpunkt nur einen Datensatz neu anlegen kann, so lässt sich aus der MAC-Adresse des anlegenden Computers und dem Zeitstempel eine global eindeutige Kennung des Datensatzes ermitteln. GUIDs der Version&nbsp;1 basieren auf der MAC-Adresse und der aktuellen Uhrzeit des berechnenden Systems. Die Verwendung der MAC-Adresse ist umstritten, da hierdurch sichtbar wird, ob ein bestimmter Host der Urheber einer GUID ist. Dies kann die Privatsphäre der GUID-Erzeuger beeinträchtigen.<ref>{{Literatur |Autor=Peter Siering, [[Christian Persson]] |Titel=Big Brother Bill. Microsofts heimliche ID-Nummern – angeblich eine Panne |Sammelwerk=[[c’t]] |Datum=1999-06 |Online=[https://www.heise.de/ct/artikel/Big-Brother-Bill-286892.html heise.de]}}</ref>

In der aktuellen Version 4 wird die MAC-Adresse nicht mehr zur Erzeugung von GUIDs herangezogen. Schlüsse auf den Urheber sind somit kaum noch möglich. Der überwiegende Teil einer GUID ist nun eine [[Pseudozufall|pseudozufällige]] Zahl, die jedoch nicht [[Kryptographisch sicherer Zufallszahlengenerator|kryptographisch sicher]] ist.

[[Microsoft]] verwendet in seinem [[Component Object Model]] ebenfalls UUIDs, dort auch GUID genannt. Allerdings entsprechen diese IDs zum Teil einer eigenen Spezifikation. Die hier beschriebenen UUIDs sind an den obersten beiden Bits des Feldes <code>clock_seq_high_and_reserved</code> erkennbar. Sie haben stets den Wert&nbsp;''10''. In der Hexadezimaldarstellung ist daher die erste Hexadezimalziffer der vierten Zahl stets zwischen 8<sub>hex</sub> und B<sub>hex</sub>, z.&nbsp;B. 5945c961-e74d-478f-'''8'''afe-da53cf4189e3. Die von Microsoft verwendeten historischen UUIDs haben in den obersten drei Bits dieses Feldes den Wert ''110'', in der Hexadezimaldarstellung ist daher die erste Hexziffer der vierten Zahl entweder C<sub>hex</sub> oder D<sub>hex</sub>. Beispiel: Der GUID des <code>IUnknown</code>-Interfaces im COM besitzt den UUID 00000000-0000-0000-'''C'''000-000000000046.

In den [[Microsoft Windows|Windows]]-Betriebssystemen von [[Microsoft]] werden GUIDs an vielen Stellen verwendet, um beispielsweise [[Microsoft Office|Office]]-Dokumente, [[Component Object Model|COM]]-Schnittstellen oder [[Active X|Active-X]]-Steuerelemente eindeutig zu identifizieren. Eine andere Anwendung ist die Identifikation von Datenträgern und Partitionstypen in der [[GUID Partition Table]].

== Squids ==

''Squids'', früher als ''HashID'' bezeichnet,<ref>[https://sqids.org/ What is Sqids?] sqids.org</ref> ist eine Codierung von Zahlen, welche aus dem [[Zeichensatz]] <code>[A-Za-z0-9]+</code> bestehen und für die Verwendung in [[Uniform Resource Identifier|URIs]] (z.&nbsp;B. [[Uniform Resource Locator|URLs]]) geeignet sind.

Die UUID <code>06637133-2230-472e-80fa-ba1c9661d0a7</code> wird z.&nbsp;B. als <code>5fQCUZjbo6srKIdYLlB5KzhkX3kkHIFM06YNrfOh9D</code> repräsentiert.

Da die Darstellung einer UUID als Squids ebenfalls relativ groß ausfällt, wird in Anwendungen, welche Objekte als UUID referenzieren, zumeist eine Tabelle hinterlegt, welche eine Zuordnung einer eindeutigen Zahl zu einer UUID ermöglicht. Diese Zahl wird als Squid codiert in der URI übermittelt.

Die Zuordnungstabelle kann z.&nbsp;B. wie folgt aussehen:

{| class="wikitable"
|-
! UUID !! Id
|-
| <code>06637133-2230-472e-80fa-ba1c9661d0a7</code> || <code>07454566<sub>h</sub></code>
|}

Der Wert <code>07454566<sub>h</sub></code> (hier im [[Hexadezimalsystem]] dargestellt) wird als das Squid <code>jkwuEpN8ujl</code> codiert und kann in der URI verwendet werden (<code><nowiki>https://example.org/jkwuEpN8ujl</nowiki></code>), um das Datenbank-Objekt mit der UUID <code>06637133-2230-472e-80fa-ba1c9661d0a7</code> zu referenzieren.

== Kollisionen ==
Kollisionen entstehen, wenn derselbe UUID mehr als einmal generiert und verschiedenen Referenzobjekten zugewiesen wird. Bei Version 1 und&nbsp;2 kann eine Kollision nur entstehen, wenn von der Standardimplementation abgewichen wird, entweder absichtlich oder unabsichtlich. Bei den Hash-basierten Versionen 3 und 5 sowie der pseudo-zufälligen Version 4 können Kollisionen auch ohne Abweichungen in der Implementierung entstehen. Jedoch ist die Wahrscheinlichkeit dafür so gering, dass sie normalerweise ignoriert werden kann. Die Wahrscheinlichkeit hierfür kann analog zum [[Geburtstagsparadoxon|Geburtstagsproblem]] genau berechnet werden.<ref>{{Internetquelle |autor=Paulo Jesus, Carlos Baquero, Paula Almaeida |url=https://repositorium.sdum.uminho.pt/bitstream/1822/36065/1/1159.pdf |titel=ID Generation in Mobile Environments |werk=Repositorium.Sdum.Uminho.pt |format=PDF |sprache=en |abruf=2023-05-09}}</ref>

Zum Beispiel beträgt die Anzahl von Version-4 UUIDs, die berechnet werden müssen, um eine 50 %-Wahrscheinlichkeit von mindestens einer Kollision zu haben, 2,71 Trillionen.:
<math>n \approx \frac{1}{2} + \sqrt{\frac{1}{4} + 2 \times \ln(2) \times 2^{122}} \approx 2{,}71 \times 10^{18}.</math>

Die kleinste Anzahl von Version-4 UUIDs, die für die Wahrscheinlichkeit, eine Kollision zu finden, erzeugt werden müssen, wird durch diese Formel [[Approximation|approximiert]]:


<math>n \approx \sqrt{2 \times 2^{122} \times \ln\frac{1}{1 - p}}.</math>
Das originale (Version 1) Generierungsschema für UUID war, die UUID-Version mit der [[MAC-Adresse]] des Computers, der die UUID generiert, und der Anzahl der 100-[[Nanosekunde]]n-Intervalle seit Beginn des [[Gregorianischer Kalender|Gregorianischen Kalenders]] aneinanderzuhängen. In der Praxis ist der eigentliche Algorithmus komplizierter. Dieses Schema wurde kritisiert, weil es nicht ausreichend „dicht“ sei; es gibt sowohl die Identität des generierenden Computers als auch den Zeitpunkt der Generierung preis.


Daher beträgt die Wahrscheinlichkeit für ein Duplikat eins aus einer Milliarde bei 103 Billionen Version-4 UUIDs.
Mehrere andere Algorithmen zur Generierung wurden entwickelt und flossen in den Standard ein, so ein Schema, welches nur auf [[Zufallszahl]]en basiert (Version 4 UUID), und Schemata, in denen die UUID aus einer [[Uniform Resource Locator|URL]] über [[Message-Digest Algorithm 5|MD5]]- (Version 3 UUID) oder [[SHA-1]]- (Version 5 UUID) [[Hash]]es hergeleitet wird.


Die Anzahl generierbarer Version-4-UUIDs beträgt 4.294.967.296 * 65.536 * 4.096 * 4 * 4.096 * 281.474.976.710.656 =
Das Release 5.0 von [[Java (Programmiersprache)|Java]] stellt eine [[Objektorientierte Programmierung|Klasse]] zur Verfügung, die 128-bittige UUID generiert. Die API-Dokumentation für die Klasse <tt>java.util.UUID</tt><ref>[http://java.sun.com/javase/6/docs/api/java/util/UUID.html Java Platform SE 6 API: java.util.UUID]</ref> verweist auf RFC 4122. Auch viele andere Sprachen stellen fertige Routinen zur Generierung von UUID bereit.
5.316.911.983.139.663.491.615.228.241.121.378.304 Stück.
Bei 1 mm je UUID ergibt sich eine Distanz von 561.998.040.061.409.650 [[Lichtjahr]]en oder 3.406.048.727.644 [[Milchstraße]]n (~165.000 Lichtjahre) oder 40.730.000 [[Universum]]-Durchmessern (~13.800.000.000 Lichtjahre).


== Implementierungen ==
=== Variante: Microsoft GUID ===
Beispiele für Implementierung des UUID-Standards in Betriebssystemen sind:
[[Microsoft]] verwendet in seinem [[Component Object Model]] ebenfalls UUIDs, dort auch [[GUID]] genannt. Allerdings entsprechen diese IDs zum Teil in einer eigenen Variante. Die hier beschriebenen UUIDs sind an den obersten beiden Bits des Feldes <tt>clock_seq_high_and_reserved</tt> erkennbar. Sie haben stets den Wert ''10''; in der Hexadezimaldarstellung ist daher die erste Hexziffer der vierten Zahl stets zwischen 8<sub>hex</sub> und B<sub>hex</sub>, z.B.: 5945c961-e74d-478f-'''8'''afe-da53cf4189e3. Die von Microsoft verwendeten historischen UUIDs haben in den obersten drei Bits dieses Feldes den Wert ''110'', in der Hexadezimaldarstellung ist daher die erste Hexziffer der vierten Zahl entweder C<sub>hex</sub> oder D<sub>hex</sub>. Beispiel: Die GUID des <code>IUnknown</code>-Interfaces im COM besitzt die UUID 00000000-0000-0000-'''C'''000-000000000046.
* In der [[Windows API]] die GUID-Struktur<ref>[https://learn.microsoft.com/en-us/windows/win32/api/guiddef/ns-guiddef-guid GUID structure (guiddef.h).] learn.microsoft.com</ref>
* Die [[Linux]]-Datei <code>/proc/sys/kernel/random/uuid</code><ref name="man7.org" />
* Unter [[FreeBSD]] implementiert als uuid(3)<ref>[https://man.freebsd.org/cgi/man.cgi?query=uuid UUID(3).] man.freebsd.org</ref>


Zudem gibt es Implementierungen für UUIDs in den [[Standardbibliothek]]en der meisten Programmiersprachen. Beispiele:
== Quellen ==
* Die [[Java (Programmiersprache)|Java]]-Klasse <code>java.util.UUID</code>
<references />
* Die [[Qt (Bibliothek)|Qt]]-Klasse <code>QUuid</code>
* In [[.NET (Plattform)|.NET]] die Klasse System.Guid<ref>[https://learn.microsoft.com/de-de/dotnet/api/system.guid System.Guid Guid Struktur.] learn.microsoft.com</ref>
** <code>System.Guid</code> implementiert UUIDv4. Ab .NET 9 wird auch UUIDv7 unterstützt. Für andere UUID-Versionen existieren Open-Source-Implementierungen.
* In [[Rust (Programmiersprache)|Rust]] mittels uuid::Uuid<ref>[https://docs.rs/uuid/latest/uuid/ Crate uuid.] docs.rs</ref> (Unterstützt UUIDs v1 bis v8)
* In [[Python (Programmiersprache)|Python]] in Lib/uuid.py<ref>[https://docs.python.org/3/library/uuid.html uuid – UUID objects according to <nowiki>RFC&nbsp;4122</nowiki>.] docs.python.org</ref>


== Weblinks ==
== Weblinks ==
* [https://pubs.opengroup.org/onlinepubs/9629399/apdxa.htm Syntax and semantics of the DCE variant of Universal Unique Identifiers (UUIDs)] (englisch)
* RFC 4122 A Universally Unique IDentifier (UUID) URN Namespace (englisch)
* {{RFC-Internet |RFC=4122 |Titel=A Universally Unique IDentifier (UUID) URN Namespace |Datum=2015-07 |Autor=Paul J. Leach, Michael Mealling, Rich Salz}}
* {{RFC-Internet |RFC=9562 |Titel=Universally Unique IDentifiers (UUIDs) |Datum=2024-05 |Autor=K. Davis, B. Peabody, P. Leach}}
* [[ITU-T]] [https://www.itu.int/rec/T-REC-X.667/en Recommendation X.667 (08/2008)] (englisch)
* [https://www.uuidtools.com/decode UUID Decoder] uuidtools.com
* [https://generateuuid.online/ UUID Generator] generateuuid.online


== Einzelnachweise ==
[[Kategorie:Identifikationstechnik]]
<references>
<ref name="man7.org">
{{Internetquelle
|url=https://man7.org/linux/man-pages/man4/random.4.html
|titel=Linux Programmer’s Manual
|titelerg=RANDOM(4)
|werk=The Linux Programming Interface
|hrsg=Michael Kerrisk
|datum=2021-03-22
|sprache=en
|abruf=2021-10-19}}
</ref>
<ref name="docs/api/java">
[https://docs.oracle.com/javase/7/docs/api/java/util/UUID.html Class <code>UUID</code>] Java API Specification bei [[Oracle]].<br /> (For more information including algorithms used to create UUIDs, see <nowiki>RFC&nbsp;4122</nowiki>: A Universally Unique IDentifier (UUID) URN Namespace, section 4.2 “Algorithms for Creating a Time-Based UUID”.)
</ref>
<ref name="rfc4122">
{{RFC-Internet |RFC=4122 |Titel=A Universally Unique IDentifier (UUID) URN Namespace |Datum=2015-07 |Autor=Paul J. Leach, Michael Mealling, Rich Salz}}
</ref>
</references>


[[Kategorie:Identifikator]]
[[en:Universally Unique Identifier]]
[[Kategorie:Datenbankmodellierung]]
[[fr:Universal Unique Identifier]]
[[Kategorie:Normalform]]
[[ja:汎用一意識別子]]
[[ru:UUID]]
[[zh:UUID]]

Aktuelle Version vom 4. Dezember 2024, 17:16 Uhr

Ein Universally Unique Identifier (UUID) ist eine 128-Bit-Zahl, welche zur Identifikation von Informationen in Computersystemen verwendet wird. Der Ausdruck Globally Unique Identifier (GUID) wird ebenfalls benutzt, typischerweise im Zusammenhang mit Microsoft (z. B. Software, Registry).

Bei der Generierung nach den Standardmethoden können UUIDs für praktische Zwecke als global eindeutig angenommen werden. Obwohl die Wahrscheinlichkeit, dass ein UUID dupliziert wird, nicht null ist, ist sie so gering, dass die Wahrscheinlichkeit für eine Kollision zumeist vernachlässigbar ist. Ein Vorteil von UUIDs ist die – im Gegensatz zu den meisten anderen Nummerierungsschemata – Unabhängigkeit von einer zentralen Registrierungsstelle oder Koordinierung zwischen den Parteien.

Daher kann jeder einen UUID erstellen und ihn zur Identifizierung eines Objekts verwenden und dabei mit größtmöglicher Sicherheit davon ausgehen, dass die Kennung keine andere Kennung dupliziert, die bereits erstellt wurde oder in Zukunft zur Identifizierung eines anderen Objekts erstellt wird.

Die Verwendung von UUIDs und GUIDs ist weit verbreitet. Viele Computerplattformen bieten Unterstützung beim Generieren und Parsen ihrer Textdarstellung.

Er wurde von der Open Software Foundation (OSF) als Teil des Distributed Computing Environment (DCE) standardisiert und ist jetzt in RFC 4122[1] geregelt.

Ein UUID besteht aus einer 16-Byte-Zahl, die hexadezimal notiert und in fünf Gruppen unterteilt wird. In seiner Normalform sieht ein UUID beispielsweise so aus:

550e8400-e29b-11d4-a716-446655440000

Geschichte und Standardisierung

[Bearbeiten | Quelltext bearbeiten]

UUID sind als Teil des Standards ISO/IEC 11578:1996 “Information technology – Open Systems InterconnectionRemote Procedure Call (RPC)” und als separater Standard ISO/IEC 9834-8:2005 dokumentiert. Die IETF hat das auf UUID basierende RFC 4122[1] veröffentlicht.

Das originale (Version 1) Generierungsschema für UUID war, die UUID-Version mit der MAC-Adresse des Computers, der den UUID generiert, und der Anzahl der 100-Nanosekunden-Intervalle seit Beginn des Gregorianischen Kalenders aneinanderzuhängen. In der Praxis ist der eigentliche Algorithmus komplizierter. Dieses Schema wurde kritisiert, weil es sowohl die Identität des generierenden Computers als auch den Zeitpunkt der Generierung preisgibt.

Mehrere andere Algorithmen zur Generierung wurden entwickelt und flossen in den Standard ein, so ein Schema, welches nur auf Zufallszahlen basiert (Version 4 UUID), und Schemata, in denen der UUID aus einem beliebigen String (z. B. DNS-Eintrag, URL, ISO OID, „X.500 Distinguished Names“, aber auch jeder beliebigen anderen Semantik, sofern ein Basis-UUID dafür definiert wird) über MD5- (Version 3 UUID) oder SHA-1- (Version 5 UUID) Hashwerte hergeleitet wird.

Das Release 5.0 von Java stellt eine Klasse zur Verfügung, die 128 Bit breite UUID generiert. Die API-Dokumentation für die Klasse java.util.UUID[2] verweist auf RFC 4122.[1] Auch viele andere Sprachen stellen fertige Routinen zur Generierung von UUID bereit.

RFC 4122[1] beschreibt den Aufbau eines UUID. Die Namen der einzelnen Felder orientieren sich an der ursprünglichen UUID-Version 1 und sind bei den heute vorwiegend verwendeten zufällig generierten UUIDs nur noch von historischem Interesse.

Aufbau einer UUID nach RFC 4122[1]
Offset Feldname Datentyp Beschreibung
0 time_low uint32_t Zeitstempel, niederstwertige 32 Bits
4 time_mid uint16_t Zeitstempel, mittlere 16 Bits
6 time_hi_and_version uint16_t Oberste Bits des Zeitstempels in den unteren 12 Bits des Feldes, die oberen 4 Bits dienen als Versionsbezeichner
8 clock_seq_high_and_reserved uint8_t Oberste 6 Bits der Clocksequenz (die obersten 2 Bits des Feldes sind in der hier beschriebenen UUID-Variante stets 1 0)
9 clock_seq_low uint8_t Untere 8 Bits der Clocksequenz
10 node uint48_t Eindeutige Node-Identifikationsnummer

Das zugehörige Bitfelddiagramm sieht wie folgt aus:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          time_low                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       time_mid                |version|        time_hi        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res |  clk_seq_low  |         node (0-1)            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         node (2-5)                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Die obersten vier Bits im Feld time_hi_and_version geben dabei die sogenannte Version des UUID an. Strenggenommen ist dies keine Version, sondern eine Art UUID-Subtyp. Folgende 5 Versionen sind bisher definiert worden:

UUID-Versionen nach RFC 4122[1]
Version Beschreibung
1 ursprünglicher, zeitstempelbasierter UUID
2 DCE Security version
3 namensbasiert, MD5-gehasht
4 zufälliger oder pseudozufälliger UUID
5 namensbasiert, SHA1-gehasht

Darüber hinaus wird die Einführung von weiteren Versionsnummern diskutiert, wie in folgender Tabelle mit Stand im Jahr 2022 dargestellt.[3]

Vorschläge zu neuen UUID-Versionen[3]
Version Beschreibung
6 zeitstempelbasierend wie Version 1, aber mit anderer Anordnung der Datenfelder
7 zeitstempelbasierend auf der Unixzeit mit zufälliger oder pseudozufälliger Komponente[4]
8 für experimentelle oder herstellerspezifische Anwendungen

Zeitstempelbasierte UUIDs

[Bearbeiten | Quelltext bearbeiten]

Der Zeitstempel ist ein 60-Bit-Wert, der die seit dem 15. Oktober 1582 (Einführung des heutigen Gregorianischen Kalenders) vergangenen 100-ns-Intervalle zählt. Um die Zeitstempel eindeutig zu halten, falls die Systemzeit einmal zurückgestellt werden muss, gibt es ein Feld Clock sequence, welches in diesem Fall entweder um 1 erhöht wird oder auf einen neuen (pseudo)zufälligen Wert gesetzt werden soll. Die Node-ID soll die MAC-Adresse einer der im System verbauten Netzwerkkarten sein oder ein pseudozufälliger Wert, falls das System keine MAC-Adresse besitzt.[5]

(Pseudo)zufällig generierte UUIDs (Version 4)

[Bearbeiten | Quelltext bearbeiten]

Hierbei werden sämtliche Bits, die nicht vom UUID-Format auf feste Werte gesetzt werden, durch (pseudo-)zufällige Werte besetzt.

Obwohl die Eindeutigkeit für einen so generierten UUID nicht garantiert ist, ist die Gesamtzahl der zufällig generierbaren UUIDs mit 2122 ≈ 5,3169 × 1036 so groß, dass die Wahrscheinlichkeit der Erzeugung zweier gleicher UUIDs sehr klein ist, sofern die verwendeten Zufallszahlenalgorithmen gleichverteilte Zufallszahlen liefern. Daher können UUIDs beliebig ohne zentrales Kontrollorgan erzeugt und zur Kennzeichnung eingesetzt werden, ohne relevante Gefahr zu laufen, dass derselbe UUID für etwas anderes verwendet wird. Mit UUID markierte Informationen können somit später in einer einzigen Datenbank zusammengeführt werden, ohne Bezeichnerkonflikte auflösen zu müssen.

Namensbasierte UUIDs (Version 3 und 5)

[Bearbeiten | Quelltext bearbeiten]

Hierbei wird ausgehend von einem nicht näher bestimmten Namen ein UUID generiert. Namen sind innerhalb eines zugewiesenen Namensraums eindeutige Bezeichner für ein Objekt, eine Ressource oder Ähnliches. Ausgehend von einem UUID für den Namensraum wird aus dem Namen ein UUID generiert, indem eine Bytesequenz aus der Namensraum-UUID und dem Namen selbst gebildet wird und diese Bytesequenz dann mit MD5 oder SHA1 gehasht wird. Der Hash wird dann auf definierte Weise auf die verfügbaren UUID-Bits verteilt.

RFC 4122[1] enthält beispielhafte Namensraum-UUIDs für die Namensräume DNS, URL, ISO OID und „X.500 Distinguished Names“.

Soll beispielsweise aus dem DNS-Namen www.example.org ein UUID-Version 5 generiert werden, so ist wie folgt vorzugehen:

  1. Namespace-UUID für „DNS“-Namen ist 6ba7b810-9dad-11d1-80b4-00c04fd430c8.
  2. An diese Bytefolge wird die Bytefolge für den Namen www.example.org angehängt (Bytes vom Namespace-UUID in fett):
    0x6b 0xa7 0xb8 0x10 0x9d 0xad 0x11 0xd1 0x80 0xb4 0x00 0xc0 0x4f 0xd4 0x30 0xc8 0x77 0x77 0x77 0x2e 0x65 0x78 0x61 0x6d 0x70 0x6c 0x65 0x2e 0x6f 0x72 0x67.
  3. Diese Bytesequenz ist mit SHA1 zu hashen. Das Ergebnis ist folgender SHA1-Hash: 74738ff55367e9589aee98fffdcd187694028007
  4. Die Bits des SHA1-Hashes sind auf die verfügbaren Bits der UUID-Version 5 aufzuteilen.
  5. Generierter UUID: 74738ff5-5367-5958-9aee-98fffdcd1876. (Die fett markierten Stellen enthalten feste Bits aus UUID-Variante und -Version.)

Zeitstempelbasierte UUIDs (Version 6)

[Bearbeiten | Quelltext bearbeiten]

UUIDv6 zielt darauf ab, die Implementierung der UUID Erstellung zu vereinfachen, indem das Bitlayouts von UUIDv1 wiederverwendet wird, jedoch mit Änderungen in der Bitreihenfolge für den Zeitstempel.

  1. Der Zeitstempel zählt in 100 Nanosekunden-Intervallen ab dem 15. Oktober 1582 um 00:00:00.00 UTC und wird auf die Felder time_high, time_mid, und t time_low aufgeteilt.
  2. Das Feld ver wird immer auf die Versionsnummer (6 bzw. 0110b) gesetzt.
  3. Das Feld var wird gesetzt auf 10b gesetzt.
  4. Das Feld clock_seq, 14 Bits, enthält die Clocksequenz.
  5. Die node-Felder können – je nach Implementierung – entweder Zufallswerte enthalten, oder die MAC-Adresse des erstellenden Computers.[6]
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           time_high                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           time_mid            |  ver  |       time_low        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|         clock_seq         |             node              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              node                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Zeitstempel + Zufallszahl basierte UUIDs (Version 7)

[Bearbeiten | Quelltext bearbeiten]

UUIDs der Version 7 bestehen aus[7]

  1. unixts: einem 36 Bit UNIX-Zeitstempel (Big-Endian codiert)
  2. subsec_a12 Bits für Sekundenbruchteile
  3. ver: 4 Bit Versionsnummer (immer auf dem Wert 7 bzw. 0111b gesetzt)
  4. subsec_b: 12 Bits für Sekundenbruchteile
  5. var: 2 Bits für die UUID Variante (immer 10b)
  6. subsec_seq_node: 62 Zufallsbits
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            unixts                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|unixts |       subsec_a        |  ver  |       subsec_b        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|                   subsec_seq_node                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       subsec_seq_node                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Durch den Zeitstempel wird eine Sortierung in Datenbanken ermöglicht, während durch die Zufallsbits Kollisionen vermieden werden.

Anwendungsspezifische UUIDs (Version 8)

[Bearbeiten | Quelltext bearbeiten]

Eine UUIDv8 besitzt im Feld ver den Wert 8 bzw. 1000b und können verwendet werden, wenn andere UUID Versionen nach [RFC4122] für eine bestimmte Anwendung nicht geeignet sind. Zudem ist ein 2 Bit großes variant Feld definiert, um verschiedene UUID-Implementierungen innerhalb einer Anwendung unterscheiden zu können.

Es wird empfohlen, dass eine UUIDv8 aus timestamp (Zeitstempel der Erstellung), clock sequence (Zählwert, der sich erhöht, wenn mehrere UUIDs für denselben Zeitstempel erstellt werden), und node Felder (Zufallswerte, MAC-Adresse, Hash-Code etc.) bestehen. Diese Felder können hierbei eine beliebige Länge aufweisen.

Das folgende Schema zeigt auf, wie eine UUIDv8 implementiert sein kann:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          timestamp_32                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           timestamp_48        |  ver  |      time_or_seq      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var|  seq_or_node  |          node                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                              node                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Globally Unique Identifier

[Bearbeiten | Quelltext bearbeiten]

Ein Globally Unique Identifier ist eine Zahl mit 128 Bit (16 Bytes), die in verteilten Computersystemen zum Einsatz kommt. GUID stellt eine Implementierung des Universally-Unique-Identifier-Standards (UUID) dar.

GUIDs werden üblicherweise im 8-4-4-4-12 Format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX dargestellt, wobei jedes X für ein Zeichen aus dem Hexadezimalsystem steht und damit eine Ziffer 0–9 oder ein Buchstabe A–F sein kann, z. B. 936DA01F-9ABD-4D9D-80C7-02AF85C822A8 (32 Buchstaben/Ziffern, mit Bindestrichen 36 Zeichen).

Die vier höchstwertigen Bits des dritten Blocks (von links aus gezählt) geben die Version der GUID an, aus der man auf die Art des verwendeten Algorithmus zur Erzeugung der GUID schließen kann. Die bis zu drei höchstwertigen Bits des vierten Blocks identifizieren die verwendete Variante. Im Beispiel ist die Version an der 4 erkennbar und die Variante an der 8 in 936DA01F-9ABD-4D9D-80C7-02AF85C822A8. Dieselbe Variante wie im Beispiel könnte statt durch eine 8 auch durch eine 9, ein A oder B gekennzeichnet sein, da für diese Variante nur die ersten beiden Bit zählen.[1]

Eine denkbare Möglichkeit, einen eindeutigen Bezeichner zu erhalten, wäre die Zuteilung durch eine zentrale Registraturstelle. Für Computer-Netzwerkkarten gibt es bereits eine solche zentrale Registraturstelle für die zugrunde liegenden MAC-Adressen. Geht man davon aus, dass ein Computer zu einem Zeitpunkt nur einen Datensatz neu anlegen kann, so lässt sich aus der MAC-Adresse des anlegenden Computers und dem Zeitstempel eine global eindeutige Kennung des Datensatzes ermitteln. GUIDs der Version 1 basieren auf der MAC-Adresse und der aktuellen Uhrzeit des berechnenden Systems. Die Verwendung der MAC-Adresse ist umstritten, da hierdurch sichtbar wird, ob ein bestimmter Host der Urheber einer GUID ist. Dies kann die Privatsphäre der GUID-Erzeuger beeinträchtigen.[8]

In der aktuellen Version 4 wird die MAC-Adresse nicht mehr zur Erzeugung von GUIDs herangezogen. Schlüsse auf den Urheber sind somit kaum noch möglich. Der überwiegende Teil einer GUID ist nun eine pseudozufällige Zahl, die jedoch nicht kryptographisch sicher ist.

Microsoft verwendet in seinem Component Object Model ebenfalls UUIDs, dort auch GUID genannt. Allerdings entsprechen diese IDs zum Teil einer eigenen Spezifikation. Die hier beschriebenen UUIDs sind an den obersten beiden Bits des Feldes clock_seq_high_and_reserved erkennbar. Sie haben stets den Wert 10. In der Hexadezimaldarstellung ist daher die erste Hexadezimalziffer der vierten Zahl stets zwischen 8hex und Bhex, z. B. 5945c961-e74d-478f-8afe-da53cf4189e3. Die von Microsoft verwendeten historischen UUIDs haben in den obersten drei Bits dieses Feldes den Wert 110, in der Hexadezimaldarstellung ist daher die erste Hexziffer der vierten Zahl entweder Chex oder Dhex. Beispiel: Der GUID des IUnknown-Interfaces im COM besitzt den UUID 00000000-0000-0000-C000-000000000046.

In den Windows-Betriebssystemen von Microsoft werden GUIDs an vielen Stellen verwendet, um beispielsweise Office-Dokumente, COM-Schnittstellen oder Active-X-Steuerelemente eindeutig zu identifizieren. Eine andere Anwendung ist die Identifikation von Datenträgern und Partitionstypen in der GUID Partition Table.

Squids, früher als HashID bezeichnet,[9] ist eine Codierung von Zahlen, welche aus dem Zeichensatz [A-Za-z0-9]+ bestehen und für die Verwendung in URIs (z. B. URLs) geeignet sind.

Die UUID 06637133-2230-472e-80fa-ba1c9661d0a7 wird z. B. als 5fQCUZjbo6srKIdYLlB5KzhkX3kkHIFM06YNrfOh9D repräsentiert.

Da die Darstellung einer UUID als Squids ebenfalls relativ groß ausfällt, wird in Anwendungen, welche Objekte als UUID referenzieren, zumeist eine Tabelle hinterlegt, welche eine Zuordnung einer eindeutigen Zahl zu einer UUID ermöglicht. Diese Zahl wird als Squid codiert in der URI übermittelt.

Die Zuordnungstabelle kann z. B. wie folgt aussehen:

UUID Id
06637133-2230-472e-80fa-ba1c9661d0a7 07454566h

Der Wert 07454566h (hier im Hexadezimalsystem dargestellt) wird als das Squid jkwuEpN8ujl codiert und kann in der URI verwendet werden (https://example.org/jkwuEpN8ujl), um das Datenbank-Objekt mit der UUID 06637133-2230-472e-80fa-ba1c9661d0a7 zu referenzieren.

Kollisionen entstehen, wenn derselbe UUID mehr als einmal generiert und verschiedenen Referenzobjekten zugewiesen wird. Bei Version 1 und 2 kann eine Kollision nur entstehen, wenn von der Standardimplementation abgewichen wird, entweder absichtlich oder unabsichtlich. Bei den Hash-basierten Versionen 3 und 5 sowie der pseudo-zufälligen Version 4 können Kollisionen auch ohne Abweichungen in der Implementierung entstehen. Jedoch ist die Wahrscheinlichkeit dafür so gering, dass sie normalerweise ignoriert werden kann. Die Wahrscheinlichkeit hierfür kann analog zum Geburtstagsproblem genau berechnet werden.[10]

Zum Beispiel beträgt die Anzahl von Version-4 UUIDs, die berechnet werden müssen, um eine 50 %-Wahrscheinlichkeit von mindestens einer Kollision zu haben, 2,71 Trillionen.:

Die kleinste Anzahl von Version-4 UUIDs, die für die Wahrscheinlichkeit, eine Kollision zu finden, erzeugt werden müssen, wird durch diese Formel approximiert:

Daher beträgt die Wahrscheinlichkeit für ein Duplikat eins aus einer Milliarde bei 103 Billionen Version-4 UUIDs.

Die Anzahl generierbarer Version-4-UUIDs beträgt 4.294.967.296 * 65.536 * 4.096 * 4 * 4.096 * 281.474.976.710.656 = 5.316.911.983.139.663.491.615.228.241.121.378.304 Stück. Bei 1 mm je UUID ergibt sich eine Distanz von 561.998.040.061.409.650 Lichtjahren oder 3.406.048.727.644 Milchstraßen (~165.000 Lichtjahre) oder 40.730.000 Universum-Durchmessern (~13.800.000.000 Lichtjahre).

Implementierungen

[Bearbeiten | Quelltext bearbeiten]

Beispiele für Implementierung des UUID-Standards in Betriebssystemen sind:

Zudem gibt es Implementierungen für UUIDs in den Standardbibliotheken der meisten Programmiersprachen. Beispiele:

  • Die Java-Klasse java.util.UUID
  • Die Qt-Klasse QUuid
  • In .NET die Klasse System.Guid[14]
    • System.Guid implementiert UUIDv4. Ab .NET 9 wird auch UUIDv7 unterstützt. Für andere UUID-Versionen existieren Open-Source-Implementierungen.
  • In Rust mittels uuid::Uuid[15] (Unterstützt UUIDs v1 bis v8)
  • In Python in Lib/uuid.py[16]
  • Syntax and semantics of the DCE variant of Universal Unique Identifiers (UUIDs) (englisch)
  • Paul J. Leach, Michael Mealling, Rich Salz: RFC: 4122 – A Universally Unique IDentifier (UUID) URN Namespace. Juli 2015 (englisch).
  • K. Davis, B. Peabody, P. Leach: RFC: 9562 – Universally Unique IDentifiers (UUIDs). Mai 2024 (englisch).
  • ITU-T Recommendation X.667 (08/2008) (englisch)
  • UUID Decoder uuidtools.com
  • UUID Generator generateuuid.online

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. a b c d e f g h Paul J. Leach, Michael Mealling, Rich Salz: RFC: 4122 – A Universally Unique IDentifier (UUID) URN Namespace. Juli 2015 (englisch).
  2. Class UUID Java API Specification bei Oracle.
    (For more information including algorithms used to create UUIDs, see RFC 4122: A Universally Unique IDentifier (UUID) URN Namespace, section 4.2 “Algorithms for Creating a Time-Based UUID”.)
  3. a b New UUID Formats, draft-peabody-dispatch-new-uuid-format-04. 23. Juni 2022, abgerufen am 30. Juni 2022.
  4. ietf.org
  5. Time-based UUID / GUID. Abgerufen am 23. Juni 2023 (englisch).
  6. RFC: 9562 – Universally Unique IDentifiers (UUIDs). Mai 2024 (englisch).
  7. BGP. Peabody, K. Davis: New UUID Formats. IETF, 10. April 2022, abgerufen am 13. Juli 2024 (englisch).
  8. Peter Siering, Christian Persson: Big Brother Bill. Microsofts heimliche ID-Nummern – angeblich eine Panne. In: c’t. Juni 1999 (heise.de).
  9. What is Sqids? sqids.org
  10. Paulo Jesus, Carlos Baquero, Paula Almaeida: ID Generation in Mobile Environments. (PDF) In: Repositorium.Sdum.Uminho.pt. Abgerufen am 9. Mai 2023 (englisch).
  11. GUID structure (guiddef.h). learn.microsoft.com
  12. Linux Programmer’s Manual. RANDOM(4). In: The Linux Programming Interface. Michael Kerrisk, 22. März 2021, abgerufen am 19. Oktober 2021 (englisch).
  13. UUID(3). man.freebsd.org
  14. System.Guid Guid Struktur. learn.microsoft.com
  15. Crate uuid. docs.rs
  16. uuid – UUID objects according to RFC 4122. docs.python.org