w

UUID-Generator

Was ist eine UUID?

UUID (Universally Unique Identifier, Universell eindeutiger Bezeichner) ist eine 128-Bit-Zahl, die verwendet wird, um Informationen in Computersystemen eindeutig zu identifizieren. UUID wird auch als GUID (Globally Unique Identifier, Global eindeutiger Bezeichner) bezeichnet.

Eigenschaften von UUID

  • Eindeutigkeit: Die Wahrscheinlichkeit, doppelte UUIDs in einem verteilten System zu generieren, ist extrem gering
  • Standardisierung: Konform mit RFC 4122-Standard
  • Plattformübergreifend: Kann in verschiedenen Betriebssystemen und Programmiersprachen verwendet werden
  • Dezentralisiert: Benötigt keine zentrale Koordinationsbehörde

Anwendungsszenarien von UUID

  1. Datenbank-Primärschlüssel: Verwendet als Primärschlüssel in verteilten Datenbanken
  2. Dateiidentifikation: Identifizierung von Dateien im Dateisystem
  3. Sitzungsverwaltung: Sitzungsbezeichner in Web-Anwendungen
  4. Nachrichtenwarteschlange: Eindeutige Identifikation von Nachrichten
  5. API-Schnittstelle: Identifikation von API-Anfragen und -Antworten

Detaillierte UUID-Versionen

UUID v1 (zeit- und knotenbasiert)

Format: xxxxxxxx-xxxx-1xxx-yxxx-xxxxxxxxxxxx

Eigenschaften:

  • Basierend auf aktueller Zeit und Knoten-ID (normalerweise MAC-Adresse)
  • Enthält Zeitstempel-Informationen, kann zeitlich sortiert werden
  • Kann MAC-Adress-Informationen preisgeben

Generierungsalgorithmus:

// Pseudocode-Beispiel
function generateUUIDv1() {
  const timestamp = Date.now();
  const nodeId = getMACAddress();
  const clockSeq = random16Bit();

  return formatUUID(timestamp, clockSeq, nodeId);
}

UUID v3 (namespace- und MD5-basiert)

Format: xxxxxxxx-xxxx-3xxx-yxxx-xxxxxxxxxxxx

Eigenschaften:

  • Basierend auf MD5-Hash von Namespace-UUID und Name
  • Derselbe Namespace und derselbe Name erzeugen immer dieselbe UUID
  • Anwendbar auf Szenarien, die deterministische UUIDs benötigen

Generierungsalgorithmus:

function generateUUIDv3(namespace, name) {
  const namespaceBytes = parseUUID(namespace);
  const nameBytes = Buffer.from(name, 'utf8');
  const hash = crypto
    .createHash('md5')
    .update(Buffer.concat([namespaceBytes, nameBytes]))
    .digest();

  return formatUUIDv3(hash);
}

UUID v4 (zufällige Generierung)

Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx

Eigenschaften:

  • Vollständig zufällige Generierung
  • Am häufigsten verwendete UUID-Version
  • Enthält keine bedeutungsvollen Informationen

Generierungsalgorithmus:

function generateUUIDv4() {
  const bytes = crypto.randomBytes(16);
  bytes[6] = (bytes[6] & 0x0f) | 0x40; // Version 4
  bytes[8] = (bytes[8] & 0x3f) | 0x80; // Variante

  return formatUUID(bytes);
}

UUID v5 (namespace- und SHA-1-basiert)

Format: xxxxxxxx-xxxx-5xxx-yxxx-xxxxxxxxxxxx

Eigenschaften:

  • Basierend auf SHA-1-Hash von Namespace-UUID und Name
  • Sicherer als v3 (verwendet SHA-1 statt MD5)
  • Anwendbar auf Szenarien, die deterministische UUIDs benötigen

UUID NIL (leere UUID)

Format: 00000000-0000-0000-0000-000000000000

Eigenschaften:

  • Alle Bits sind 0
  • Verwendet, um "keine UUID" oder "unbekannte UUID" darzustellen
  • Verwendet als Standardwert in Datenbankdesign

Vordefinierte Namespaces

Standard-Namespace-UUIDs

  • DNS-Namespace: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
  • URL-Namespace: 6ba7b811-9dad-11d1-80b4-00c04fd430c8
  • OID-Namespace: 6ba7b812-9dad-11d1-80b4-00c04fd430c8
  • X.500 DN-Namespace: 6ba7b814-9dad-11d1-80b4-00c04fd430c8

Verwendungsbeispiel

// UUID v3 mit DNS-Namespace generieren
const dnsNamespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
const uuid = generateUUIDv3(dnsNamespace, 'example.com');
// Ergebnis: 5df41881-3aed-3515-88a7-2f4a814cf09e

API-Schnittstelle

Einzelne UUID-Generierung

// UUID v4 generieren
const uuid = generateUUID('v4');

// UUID v1 generieren
const uuid = generateUUID('v1');

// UUID v3 generieren
const uuid = generateUUID('v3', {
  namespace: '6ba7b810-9dad-11d1-80b4-00c04fd430c8',
  name: 'example.com',
});

Batch-UUID-Generierung

// Batch-UUID-Generierung
const uuids = generateMultipleUUIDs('v4', 10);

// UUIDs verschiedener Versionen generieren
const mixedUUIDs = generateMultipleUUIDs(['v1', 'v4', 'v5'], 5);

UUID-Validierung

// UUID-Format validieren
const isValid = validateUUID('550e8400-e29b-41d4-a716-446655440000');

// UUID-Version abrufen
const version = getUUIDVersion('550e8400-e29b-41d4-a716-446655440000');

Leistungsüberlegungen

Generierungsgeschwindigkeit

  • v4 (zufällig): Am schnellsten, etwa 100.000 UUID/Sekunde
  • v1 (Zeit): Mittel, etwa 50.000 UUID/Sekunde
  • v3/v5 (Hash): Langsamer, etwa 10.000 UUID/Sekunde

Speichernutzung

  • Jede UUID belegt 16 Byte
  • Achten Sie auf Speichernutzung bei Batch-Generierung

Nebenläufigkeitssicherheit

  • v4 verwendet einen kryptographisch sicheren Zufallszahlengenerator
  • v1 erfordert Sicherstellung der Eindeutigkeit der Uhrsequenz

Best Practices

UUID-Versionsauswahl

  1. Allgemeine Verwendung: UUID v4 verwenden
  2. Zeitliche Sortierung erforderlich: UUID v1 verwenden
  3. Determinismus erforderlich: UUID v3 oder v5 verwenden
  4. Datenbank-Primärschlüssel: UUID v4 empfehlen

Speicheroptimierung

-- UUID-Speicherung in PostgreSQL
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(255)
);

-- Index erstellen
CREATE INDEX idx_users_id ON users(id);

Leistungsoptimierung

// Objektpool verwenden, um Speicherzuweisung zu reduzieren
const uuidPool = new Array(1000).fill(null).map(() => generateUUIDv4());

// Web Workers für Batch-Generierung verwenden
const worker = new Worker('uuid-worker.js');
worker.postMessage({ type: 'generate', count: 1000 });

Häufig gestellte Fragen

F: Was ist der Unterschied zwischen UUID und GUID?

A: UUID und GUID sind im Wesentlichen gleich, nur die Namen unterscheiden sich. UUID ist der RFC-Standardbegriff, GUID ist der Microsoft-Begriff.

F: Können UUIDs dupliziert werden?

A: Theoretisch möglich, aber die Wahrscheinlichkeit ist extrem gering. Die Duplikationswahrscheinlichkeit einer v4 UUID beträgt etwa 2,71 × 10^-36.

F: Wie wähle ich die UUID-Version?

A: Je nach Anforderungen wählen:

  • Zufälligkeit erforderlich: v4
  • Zeitinformationen erforderlich: v1
  • Determinismus erforderlich: v3 oder v5

F: Beeinflusst UUID die Datenbankleistung?

A: Kann beeinflussen, da UUID größer als ein Integer-Primärschlüssel ist. Empfehlungen:

  • B-Tree-Indizes verwenden
  • Verwendung von UUID v1 (zeitliche Sortierung) erwägen
  • Integer-Primärschlüssel in angemessenen Fällen verwenden

Verwandte Tools

Technische Spezifikationen

RFC-Standards

  • RFC 4122: UUID-Spezifikation
  • RFC 4122 Section 4.1.3: UUID-Versionsdefinitionen

Programmiersprachen-Unterstützung

  • JavaScript: crypto.randomUUID() (Node.js 14.17+)
  • Python: uuid-Modul
  • Java: java.util.UUID
  • C#: System.Guid

Letzte Aktualisierung: 20. Januar 2024

Was this page helpful?