Whiz Tools

UUID-generator

Genereret UUID

UUID-struktur
Tid lav

UUID Generator

Introduktion

En Universally Unique Identifier (UUID) er et 128-bit nummer, der bruges til at identificere information i computersystemer. UUID'er er standardiseret af Open Software Foundation (OSF) som en del af Distributed Computing Environment (DCE). Disse identifikatorer er designet til at være unikke på tværs af både rum og tid, hvilket gør dem ideelle til forskellige anvendelser i distribuerede systemer og videre.

Dette UUID-generatorværktøj giver dig mulighed for at oprette både version 1 (tidsbaseret) og version 4 (tilfældig) UUID'er. Disse identifikatorer er nyttige i forskellige scenarier, hvor unik identifikation er påkrævet, såsom database-nøgler, distribuerede systemer og netværksprotokoller.

Hvordan UUID'er fungerer

UUID-struktur

En UUID repræsenteres typisk som 32 hexadecimale cifre, vist i fem grupper adskilt af bindestreger, i formen 8-4-4-4-12 for i alt 36 tegn (32 alfanumeriske tegn og 4 bindestreger). For eksempel:

550e8400-e29b-41d4-a716-446655440000

De 128 bit af en UUID er opdelt i specifikke felter, der hver bærer forskellige oplysninger afhængigt af UUID-versionen:

  • 32 bit til time_low-feltet
  • 16 bit til time_mid-feltet
  • 16 bit til time_hi_and_version-feltet
  • 8 bit til clock_seq_hi_and_reserved-feltet
  • 8 bit til clock_seq_low-feltet
  • 48 bit til node-feltet

Her er et diagram, der illustrerer UUID-strukturen:

A B C D E F A: time_low (32 bit) B: time_mid (16 bit) C: time_hi_and_version (16 bit) D: clock_seq_hi_and_reserved (8 bit) E: clock_seq_low (8 bit) F: node (48 bit)

UUID-versioner

Der er flere versioner af UUID'er, hver med sin egen genereringsmetode:

  1. Version 1 (Tidsbaseret): Bruger det nuværende tidsstempel og MAC-adressen på computeren.
  2. Version 2 (DCE-sikkerhed): Ligner version 1, men inkluderer en lokal domæneidentifikator.
  3. Version 3 (Navnebasseret, MD5): Genereres ved at hash'e en navneområdeidentifikator og navn.
  4. Version 4 (Tilfældig): Genereres ved hjælp af et tilfældigt eller pseudo-tilfældigt nummer.
  5. Version 5 (Navnebasseret, SHA-1): Ligner version 3, men bruger SHA-1 hashing.

Dette værktøj fokuserer på at generere Version 1 og Version 4 UUID'er.

Formel

Version 1 UUID-generering

Version 1 UUID'er genereres ved hjælp af følgende komponenter:

  1. Tidsstempel: En 60-bit værdi, der repræsenterer antallet af 100-nanosekunders intervaller siden 15. oktober 1582 (datoen for den gregorianske reform af den kristne kalender).
  2. Clock sequence: En 14-bit værdi, der bruges til at undgå dubletter i tilfælde af, at uret sættes tilbage.
  3. Node: En 48-bit værdi, der normalt er afledt af MAC-adressen på computeren.

Formlen for at generere en Version 1 UUID kan udtrykkes som:

UUID = (timestamp * 2^64) + (clock_sequence * 2^48) + node

Version 4 UUID-generering

Version 4 UUID'er genereres ved hjælp af en kryptografisk stærk tilfældig talgenerator. Formlen er simpelthen:

UUID = random_128_bit_number

Med specifikke bits sat for at angive versionen (4) og varianten.

Anvendelsestilfælde

UUID'er har mange anvendelser på tværs af forskellige domæner inden for datalogi og softwareudvikling:

  1. Database-nøgler: UUID'er bruges ofte som primære nøgler i databaser, især i distribuerede systemer, hvor flere noder kan generere poster samtidig.

  2. Distribuerede systemer: I storskala distribuerede systemer hjælper UUID'er med at identificere ressourcer, transaktioner eller begivenheder unikt på tværs af flere noder eller datacentre.

  3. Indholdsadressere: UUID'er kan bruges til at oprette unikke identifikatorer for indhold i indholds-adresserbare lagringssystemer.

  4. Session Management: Webapplikationer bruger ofte UUID'er til at administrere bruger-sessioner, hvilket sikrer, at hver session har en unik identifikator.

  5. IoT-enhedsidentifikation: I Internet of Things (IoT) applikationer kan UUID'er bruges til at identificere individuelle enheder unikt i et netværk.

Alternativer

Selvom UUID'er er meget anvendte, er der alternative tilgange til at generere unikke identifikatorer:

  1. Auto-incrementing IDs: Enkle og almindeligt anvendte i enkelt-database systemer, men ikke egnede til distribuerede miljøer.

  2. Tidsstempel-baserede IDs: Kan være nyttige til tidsordnede data, men kan stå over for kollisionsproblemer i høj-konkurrence scenarier.

  3. Snowflake IDs: Udviklet af Twitter, disse IDs kombinerer tidsstempel og arbejdere nummer for at generere unikke IDs i distribuerede systemer.

  4. ULID (Universally Unique Lexicographically Sortable Identifier): Et nyere alternativ, der sigter mod at være mere menneskevenligt og sortérbart end UUID'er.

Historie

Konceptet med UUID'er blev først introduceret i Apollo Network Computing System og senere standardiseret af Open Software Foundation (OSF) som en del af Distributed Computing Environment (DCE) i 1990'erne. Den første specifikation blev offentliggjort i 1997 som ISO/IEC 11578:1996 og senere revideret i 2005 som en del af ISO/IEC 9834-8:2005.

Nøglemilepæle i UUID-historien:

  • 1980'erne: Apollo Computer udvikler UUID-konceptet til deres Network Computing System.
  • 1997: Første UUID-specifikation offentliggjort som ISO/IEC 11578:1996.
  • 2005: UUID-specifikation revideret og offentliggjort som en del af ISO/IEC 9834-8:2005.
  • 2009: RFC 4122 definerer UUID-formatet og genereringsalgoritmerne, der bruges i dag.

Over tid er UUID'er blevet et vigtigt værktøj i distribuerede systemer og database-design, med forskellige implementeringer og tilpasninger på tværs af forskellige programmeringssprog og platforme.

Kodeeksempler

Her er eksempler på at generere UUID'er i forskellige programmeringssprog:

import uuid

## Generer en Version 4 (tilfældig) UUID
random_uuid = uuid.uuid4()
print(f"Version 4 UUID: {random_uuid}")

## Generer en Version 1 (tidsbaseret) UUID
time_based_uuid = uuid.uuid1()
print(f"Version 1 UUID: {time_based_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// Generer en Version 4 (tilfældig) UUID
const randomUuid = uuidv4();
console.log(`Version 4 UUID: ${randomUuid}`);

// Generer en Version 1 (tidsbaseret) UUID
const timeBasedUuid = uuidv1();
console.log(`Version 1 UUID: ${timeBasedUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // Generer en Version 4 (tilfældig) UUID
        UUID randomUuid = UUID.randomUUID();
        System.out.println("Version 4 UUID: " + randomUuid);

        // Generer en Version 1 (tidsbaseret) UUID
        UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("Version 1 UUID: " + timeBasedUuid);
    }
}
require 'securerandom'

## Generer en Version 4 (tilfældig) UUID
random_uuid = SecureRandom.uuid
puts "Version 4 UUID: #{random_uuid}"

## Ruby har ikke en indbygget metode til Version 1 UUID'er
## Du skal bruge en gem som 'uuidtools' til det
<?php
// Generer en Version 4 (tilfældig) UUID
$randomUuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
    mt_rand(0, 0xffff), mt_rand(0, 0xffff),
    mt_rand(0, 0xffff),
    mt_rand(0, 0x0fff) | 0x4000,
    mt_rand(0, 0x3fff) | 0x8000,
    mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
echo "Version 4 UUID: " . $randomUuid . "\n";

// PHP har ikke en indbygget metode til Version 1 UUID'er
// Du skal bruge et bibliotek som 'ramsey/uuid' til det
?>

Referencer

  1. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://tools.ietf.org/html/rfc4122
  2. International Organization for Standardization. (2005). Information technology – Open Systems Interconnection – Procedures for the operation of OSI Registration Authorities: Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 Object Identifier components. ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. Universally unique identifier. (2023). In Wikipedia. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. Snowflake ID. (2023). In Wikipedia. https://en.wikipedia.org/wiki/Snowflake_ID
  5. ULID Spec. (n.d.). GitHub. https://github.com/ulid/spec
Feedback