Whiz Tools

UUID-generator

Generert UUID

UUID-struktur
Tid lav

UUID-generator

Innledning

En Universelt Unik Identifikator (UUID) er et 128-bit tall som brukes til å identifisere informasjon i datasystemer. UUID-er er standardisert av Open Software Foundation (OSF) som en del av Distributed Computing Environment (DCE). Disse identifikatorene er designet for å være unike på tvers av både rom og tid, noe som gjør dem ideelle for ulike applikasjoner i distribuerte systemer og utover.

Dette UUID-generatorverktøyet lar deg opprette både versjon 1 (tidsbasert) og versjon 4 (tilfeldig) UUID-er. Disse identifikatorene er nyttige i ulike scenarier der unik identifikasjon er nødvendig, som database-nøkler, distribuerte systemer og nettverksprotokoller.

Hvordan UUID-er fungerer

UUID-struktur

En UUID er vanligvis representert som 32 heksadesimale sifre, vist i fem grupper adskilt av bindestreker, i formen 8-4-4-4-12 for totalt 36 tegn (32 alfanumeriske tegn og 4 bindestreker). For eksempel:

550e8400-e29b-41d4-a716-446655440000

De 128 bitene av en UUID er delt inn i spesifikke felt, hver med forskjellig informasjon avhengig av UUID-versjonen:

  • 32 biter for time_low-feltet
  • 16 biter for time_mid-feltet
  • 16 biter for time_hi_and_version-feltet
  • 8 biter for clock_seq_hi_and_reserved-feltet
  • 8 biter for clock_seq_low-feltet
  • 48 biter for node-feltet

Her er et diagram som illustrerer UUID-strukturen:

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

UUID-versjoner

Det finnes flere versjoner av UUID-er, hver med sin egen genereringsmetode:

  1. Versjon 1 (Tidsbasert): Bruker den nåværende tidsstempelet og MAC-adressen til datamaskinen.
  2. Versjon 2 (DCE-sikkerhet): Ligner på versjon 1, men inkluderer en lokal domeneidentifikator.
  3. Versjon 3 (Navn-basert, MD5): Generert ved å hash en navneromidentifikator og navn.
  4. Versjon 4 (Tilfeldig): Generert ved hjelp av et tilfeldig eller pseudo-tilfeldig tall.
  5. Versjon 5 (Navn-basert, SHA-1): Ligner på versjon 3, men bruker SHA-1 hashing.

Dette verktøyet fokuserer på å generere versjon 1 og versjon 4 UUID-er.

Formel

Versjon 1 UUID-generering

Versjon 1 UUID-er genereres ved hjelp av følgende komponenter:

  1. Tidsstempel: En 60-bit verdi som representerer antall 100-nanosekund intervaller siden 15. oktober 1582 (datoen for den gregorianske reformen av den kristne kalenderen).
  2. Klokkesekvens: En 14-bit verdi som brukes for å unngå duplikater i tilfelle klokken settes tilbake.
  3. Node: En 48-bit verdi, vanligvis avledet fra MAC-adressen til datamaskinen.

Formelen for å generere en versjon 1 UUID kan uttrykkes som:

UUID = (tidsstempel * 2^64) + (klokkesekvens * 2^48) + node

Versjon 4 UUID-generering

Versjon 4 UUID-er genereres ved hjelp av en kryptografisk sterk tilfeldig tallgenerator. Formelen er ganske enkelt:

UUID = tilfeldig_128-bit_nummer

Med spesifikke biter satt for å indikere versjonen (4) og varianten.

Bruksområder

UUID-er har mange bruksområder på tvers av ulike domener innen datavitenskap og programvareutvikling:

  1. Database-nøkler: UUID-er brukes ofte som primærnøkler i databaser, spesielt i distribuerte systemer der flere noder kan generere poster samtidig.

  2. Distribuerte systemer: I store distribuerte systemer hjelper UUID-er med å unikt identifisere ressurser, transaksjoner eller hendelser på tvers av flere noder eller datasentre.

  3. Innholdsadressere: UUID-er kan brukes til å lage unike identifikatorer for innhold i innholdsadressable lagringssystemer.

  4. Sesjonsadministrasjon: Nettapplikasjoner bruker ofte UUID-er til å administrere brukerøkter, og sikrer at hver økt har en unik identifikator.

  5. IoT-enhetsidentifikasjon: I Internet of Things (IoT) applikasjoner kan UUID-er brukes til å unikt identifisere individuelle enheter i et nettverk.

Alternativer

Selv om UUID-er er mye brukt, finnes det alternative tilnærminger for å generere unike identifikatorer:

  1. Auto-inkrementerende ID-er: Enkle og vanlig brukt i enkelt-database systemer, men ikke egnet for distribuerte miljøer.

  2. Tidsstempel-baserte ID-er: Kan være nyttige for tidsbestemte data, men kan møte kollisjonsproblemer i høy-konkurranse scenarier.

  3. Snowflake ID-er: Utviklet av Twitter, disse ID-ene kombinerer tidsstempel og arbeidernummer for å generere unike ID-er i distribuerte systemer.

  4. ULID (Universally Unique Lexicographically Sortable Identifier): Et nyere alternativ som har som mål å være mer menneskevennlig og sortert enn UUID-er.

Historie

Konseptet med UUID-er ble først introdusert i Apollo Network Computing System og senere standardisert av Open Software Foundation (OSF) som en del av Distributed Computing Environment (DCE) på 1990-tallet. Den første spesifikasjonen ble publisert i 1997 som ISO/IEC 11578:1996 og senere revidert i 2005 som en del av ISO/IEC 9834-8:2005.

Viktige milepæler i UUID-historien:

  • 1980-tallet: Apollo Computer utvikler UUID-konseptet for sitt Network Computing System.
  • 1997: Første UUID-spesifikasjon publisert som ISO/IEC 11578:1996.
  • 2005: UUID-spesifikasjon revidert og publisert som en del av ISO/IEC 9834-8:2005.
  • 2009: RFC 4122 definerer UUID-formatet og genereringsalgoritmene som brukes i dag.

Over tid har UUID-er blitt et viktig verktøy i distribuerte systemer og database-design, med ulike implementeringer og tilpasninger på tvers av forskjellige programmeringsspråk og plattformer.

Kodeeksempler

Her er eksempler på generering av UUID-er i ulike programmeringsspråk:

import uuid

## Generer en versjon 4 (tilfeldig) UUID
tilfeldig_uuid = uuid.uuid4()
print(f"Versjon 4 UUID: {tilfeldig_uuid}")

## Generer en versjon 1 (tidsbasert) UUID
tidsbasert_uuid = uuid.uuid1()
print(f"Versjon 1 UUID: {tidsbasert_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// Generer en versjon 4 (tilfeldig) UUID
const tilfeldigUuid = uuidv4();
console.log(`Versjon 4 UUID: ${tilfeldigUuid}`);

// Generer en versjon 1 (tidsbasert) UUID
const tidsbasertUuid = uuidv1();
console.log(`Versjon 1 UUID: ${tidsbasertUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // Generer en versjon 4 (tilfeldig) UUID
        UUID tilfeldigUuid = UUID.randomUUID();
        System.out.println("Versjon 4 UUID: " + tilfeldigUuid);

        // Generer en versjon 1 (tidsbasert) UUID
        UUID tidsbasertUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("Versjon 1 UUID: " + tidsbasertUuid);
    }
}
require 'securerandom'

## Generer en versjon 4 (tilfeldig) UUID
tilfeldig_uuid = SecureRandom.uuid
puts "Versjon 4 UUID: #{tilfeldig_uuid}"

## Ruby har ikke en innebygd metode for versjon 1 UUID-er
## Du må bruke en gem som 'uuidtools' for det
<?php
// Generer en versjon 4 (tilfeldig) UUID
$tilfeldigUuid = 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 "Versjon 4 UUID: " . $tilfeldigUuid . "\n";

// PHP har ikke en innebygd metode for versjon 1 UUID-er
// Du må bruke et bibliotek som 'ramsey/uuid' for det
?>

Referanser

  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