# UUID

# Versionen

# V1 - V7

UUIDs (Universally Unique Identifiers) haben mehrere **Versionen (v1–v7)**, die sich vor allem darin unterscheiden, **wie sie erzeugt werden**. Jede Version hat ihren eigenen Zweck und Kompromisse (z. B. zwischen Zufälligkeit, Nachvollziehbarkeit und Sortierbarkeit).

Hier ist eine verständliche Übersicht:

---

## 🔹 UUID v1 – Zeit + MAC-Adresse

**Prinzip:** basiert auf Zeitstempel + Gerätekennung

- Enthält: 
    - Zeit (100-ns seit 1582 😄)
    - MAC-Adresse des Geräts
- ✅ Vorteile: 
    - Hohe Wahrscheinlichkeit eindeutig
    - Zeitlich sortierbar
- ❌ Nachteile: 
    - Datenschutzproblem (MAC-Adresse sichtbar)
    - Kann Rückschlüsse auf Erstellungszeit geben

👉 Heute oft gemieden wegen Privacy

---

## 🔹 UUID v2 – DCE Security (selten genutzt)

**Prinzip:** wie v1, aber mit zusätzlicher Benutzer-/Gruppen-ID

- Erweiterung von v1 (POSIX UID/GID)
- ❌ Nachteile: 
    - Kaum verbreitet
    - Nicht standardmäßig unterstützt

👉 Praktisch irrelevant in modernen Systemen

---

## 🔹 UUID v3 – Name-basiert (MD5)

**Prinzip:** Hash aus Name + Namespace

- Deterministisch: 
    - gleicher Input → gleiche UUID
- Verwendet: 
    - MD5 (heute kryptografisch schwach)
- ✅ Vorteil: 
    - Reproduzierbar
- ❌ Nachteil: 
    - MD5 gilt als unsicher

👉 Wird selten noch neu eingesetzt

---

## 🔹 UUID v4 – Zufällig

**Prinzip:** komplett zufällige Bits

- 122 zufällige Bits
- ✅ Vorteile: 
    - Sehr einfach
    - Keine Infos über Ursprung
    - Sehr geringe Kollisionswahrscheinlichkeit
- ❌ Nachteile: 
    - Nicht sortierbar
    - Keine Struktur

👉 **Am häufigsten verwendet**

---

## 🔹 UUID v5 – Name-basiert (SHA-1)

**Prinzip:** wie v3, aber mit SHA-1

- Deterministisch
- Verwendet SHA-1 statt MD5
- ✅ Vorteil: 
    - Sicherer als v3
- ❌ Nachteil: 
    - SHA-1 ist inzwischen auch veraltet

👉 Wird noch genutzt, aber nicht ideal für neue Systeme

---

## 🔹 UUID v6 – Zeitbasiert (verbessertes v1)

**Prinzip:** wie v1, aber besser sortierbar

- Zeitstempel vorne angeordnet
- ✅ Vorteile: 
    - **Lexikografisch sortierbar**
    - Besser für Datenbanken (Indexe)
- ❌ Nachteile: 
    - Teilweise noch Zeitinformationen enthalten

👉 Moderne Alternative zu v1

---

## 🔹 UUID v7 – Zeit + Zufall (modern)

**Prinzip:** Unix-Zeit + Zufallsbits

- Enthält: 
    - Unix-Timestamp (Millisekunden)
    - Zufällige Bits
- ✅ Vorteile: 
    - Sortierbar nach Zeit
    - Keine MAC-Adresse → besserer Datenschutz
    - Gute Balance zwischen Struktur und Zufälligkeit
- ❌ Nachteile: 
    - Relativ neu (Support noch im Aufbau, aber wächst schnell)

👉 **Aktuell die empfohlene moderne Wahl**

---

## 🧠 Kurzvergleich

<table id="bkmrk-version-basis-sortie"><thead><tr><th>Version</th><th>Basis</th><th>Sortierbar</th><th>Deterministisch</th><th>Typische Nutzung</th></tr></thead><tbody><tr><td>v1</td><td>Zeit + MAC</td><td>✅</td><td>❌</td><td>Legacy</td></tr><tr><td>v2</td><td>v1 + UID</td><td>✅</td><td>❌</td><td>Kaum genutzt</td></tr><tr><td>v3</td><td>MD5 Hash</td><td>❌</td><td>✅</td><td>Reproduzierbar</td></tr><tr><td>v4</td><td>Zufall</td><td>❌</td><td>❌</td><td>Standard</td></tr><tr><td>v5</td><td>SHA-1 Hash</td><td>❌</td><td>✅</td><td>Reproduzierbar</td></tr><tr><td>v6</td><td>Zeit (neu sortiert)</td><td>✅</td><td>❌</td><td>DB-optimiert</td></tr><tr><td>v7</td><td>Zeit + Zufall</td><td>✅</td><td>❌</td><td>**Modern / empfohlen**</td></tr></tbody></table>

---

## ✅ Empfehlung (Stand heute)

- **v4** → wenn dir Einfachheit reicht
- **v7** → wenn du moderne Systeme baust (DB, Skalierung, Sortierung)

# Aufbau

# Struktur einer UUID

# Grundstruktur einer UUID

Eine UUID besteht immer aus **128 Bits = 16 Bytes**.

Typische Darstellung:

```
123e4567-e89b-12d3-a456-426614174000

```

Aufgeteilt:

```
8-4-4-4-12 Hex-Zeichen

```

Das entspricht:

- 32 Bit – 16 Bit – 16 Bit – 16 Bit – 48 Bit

---

# Bit-Level Aufbau (allgemein)

Eine UUID hat zwei wichtige feste Bestandteile:

## 1. 🔢 Version (4 Bits)

- Gibt an, **wie die UUID erzeugt wurde (v1–v7)**
- Sitzt im **3. Block** (die ersten 4 Bits davon)

Beispiel:

```
xxxxxxxx-xxxx-1xxx-....
             ↑
           Version

```

---

## 2. 🧭 Variant (2–3 Bits)

- Gibt das Format der UUID an (meist RFC 4122 / 9562)
- Sitzt im **4. Block am Anfang**

Typische Werte:

- `10xx` → Standard UUID (das, was du fast immer siehst)

Beispiel:

```
xxxxxxxx-xxxx-xxxx-8xxx-....
                 ↑
              Variant

```

---

# 📦 Beispiel analysiert

UUID:

```
123e4567-e89b-12d3-a456-426614174000

```

👉 Zerlegt:

- `123e4567` → Teil 1
- `e89b` → Teil 2
- `12d3` → Teil 3 → **Version = 1**
- `a456` → Teil 4 → **Variant = a (= 1010 → RFC-konform)**
- `426614174000` → Teil 5

---

# 🧩 Unterschied je nach Version

Jetzt wird’s interessant:  
**Der Inhalt der 128 Bits hängt stark von der Version ab.**

---

## 🔹 UUID v1 (Zeitbasiert)

Aufbau:

```
time_low (32)
time_mid (16)
time_high + version (16)
variant + clock_seq (16)
node (48)

```

Enthält:

- Zeitstempel
- Clock Sequence (gegen Kollisionen)
- MAC-Adresse

👉 Deshalb:

- eindeutig
- aber privacy-problematisch

---

## 🔹 UUID v4 (Random)

Aufbau:

```
random (122 bits)
+ version (4 bits)
+ variant (2-3 bits)

```

👉 Fast alles ist Zufall  
Nur:

- Version
- Variant

sind fest codiert

---

## 🔹 UUID v7 (modern 🔥)

Aufbau (vereinfacht):

```
unix_ts_ms (48 bits)
version (4 bits)
rand (12 bits)
variant (2-3 bits)
rand (62 bits)

```

👉 Mischung aus:

- Zeit (Millisekunden seit 1970)
- Zufall

Vorteil:

- Sortierbar
- Keine MAC-Adresse
- Gute Verteilung

---

# 📊 Visuelle Darstellung (v7 Beispiel)

```
|------ Zeit (48) ------|ver|--- rand ---|var|-------- rand --------|

```

---

# 🧠 Wichtige Erkenntnisse

- UUID ist **kein reiner Zufallsstring**
- Einige Bits sind immer reserviert: 
    - Version
    - Variant
- Je nach Version: 
    - Zeit enthalten ✅
    - Hash enthalten ✅
    - MAC enthalten ✅
    - oder komplett random ✅

---

# ⚠️ Kleine Stolperfallen

- Hex-Darstellung ≠ echte interne Reihenfolge (Endianness kann verwirren)
- v1/v6 können Infos leaken (Zeit, Gerät)
- v4 ist nicht sortierbar → schlecht für DB-Indizes
- v7 löst viele dieser Probleme