Whiz Tools

Generator UUID

Wygenerowany UUID

Struktura UUID
Czas niski

Generator UUID

Wprowadzenie

Uniwersalny Unikalny Identifikator (UUID) to 128-bitowa liczba używana do identyfikacji informacji w systemach komputerowych. UUID są standaryzowane przez Open Software Foundation (OSF) jako część Środowiska Rozproszonego Obliczeń (DCE). Te identyfikatory są zaprojektowane tak, aby były unikalne zarówno w przestrzeni, jak i czasie, co czyni je idealnymi do różnych zastosowań w systemach rozproszonych i nie tylko.

To narzędzie do generowania UUID pozwala na tworzenie zarówno wersji 1 (opartej na czasie), jak i wersji 4 (losowej) UUID. Te identyfikatory są przydatne w różnych scenariuszach, w których wymagana jest unikalna identyfikacja, takich jak klucze bazy danych, systemy rozproszone i protokoły sieciowe.

Jak działają UUID

Struktura UUID

UUID jest zazwyczaj reprezentowany jako 32 cyfry szesnastkowe, wyświetlane w pięciu grupach oddzielonych myślnikami, w formacie 8-4-4-4-12, co daje łącznie 36 znaków (32 znaki alfanumeryczne i 4 myślniki). Na przykład:

550e8400-e29b-41d4-a716-446655440000

128 bitów UUID jest podzielonych na konkretne pola, z których każde niesie różne informacje w zależności od wersji UUID:

  • 32 bity dla pola time_low
  • 16 bitów dla pola time_mid
  • 16 bitów dla pola time_hi_and_version
  • 8 bitów dla pola clock_seq_hi_and_reserved
  • 8 bitów dla pola clock_seq_low
  • 48 bitów dla pola node

Oto diagram ilustrujący strukturę UUID:

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

Wersje UUID

Istnieje kilka wersji UUID, z których każda ma swoją metodę generacji:

  1. Wersja 1 (oparta na czasie): Używa aktualnego znacznika czasu i adresu MAC komputera.
  2. Wersja 2 (bezpieczeństwo DCE): Podobna do wersji 1, ale zawiera identyfikator lokalnej domeny.
  3. Wersja 3 (oparta na nazwie, MD5): Generowana przez hashowanie identyfikatora przestrzeni nazw i nazwy.
  4. Wersja 4 (losowa): Generowana przy użyciu losowego lub pseudo-losowego numeru.
  5. Wersja 5 (oparta na nazwie, SHA-1): Podobna do wersji 3, ale używa haszowania SHA-1.

To narzędzie koncentruje się na generowaniu UUID wersji 1 i wersji 4.

Formuła

Generowanie UUID Wersji 1

UUID wersji 1 są generowane przy użyciu następujących komponentów:

  1. Znacznik czasu: 60-bitowa wartość reprezentująca liczbę 100-nanosekundowych interwałów od 15 października 1582 roku (data reformy gregoriańskiej kalendarza chrześcijańskiego).
  2. Sekwencja zegara: 14-bitowa wartość używana do unikania duplikatów w przypadku, gdy zegar jest ustawiony wstecz.
  3. Węzeł: 48-bitowa wartość, zazwyczaj pochodząca z adresu MAC komputera.

Formuła generowania UUID wersji 1 może być wyrażona jako:

UUID = (znacznik_czasu * 2^64) + (sekwencja_zegara * 2^48) + węzeł

Generowanie UUID Wersji 4

UUID wersji 4 są generowane przy użyciu kryptograficznie silnego generatora liczb losowych. Formuła jest po prostu:

UUID = losowa_liczba_128_bitowa

Z określonymi bitami ustawionymi, aby wskazać wersję (4) i wariant.

Przykłady użycia

UUID mają liczne zastosowania w różnych dziedzinach informatyki i inżynierii oprogramowania:

  1. Klucze bazy danych: UUID są często używane jako klucze główne w bazach danych, szczególnie w systemach rozproszonych, gdzie wiele węzłów może jednocześnie generować rekordy.

  2. Systemy rozproszone: W dużych systemach rozproszonych UUID pomagają w unikalnej identyfikacji zasobów, transakcji lub zdarzeń w wielu węzłach lub centrach danych.

  3. Adresowanie zawartości: UUID mogą być używane do tworzenia unikalnych identyfikatorów dla zawartości w systemach przechowywania adresowalnej zawartości.

  4. Zarządzanie sesjami: Aplikacje internetowe często używają UUID do zarządzania sesjami użytkowników, zapewniając, że każda sesja ma unikalny identyfikator.

  5. Identyfikacja urządzeń IoT: W aplikacjach Internetu Rzeczy (IoT) UUID mogą być używane do unikalnej identyfikacji poszczególnych urządzeń w sieci.

Alternatywy

Chociaż UUID są szeroko stosowane, istnieją alternatywne podejścia do generowania unikalnych identyfikatorów:

  1. Identyfikatory autoinkrementacyjne: Proste i powszechnie stosowane w systemach z jedną bazą danych, ale nieodpowiednie dla środowisk rozproszonych.

  2. Identyfikatory oparte na znaczniku czasu: Mogą być przydatne dla danych uporządkowanych czasowo, ale mogą napotykać problemy z kolizjami w scenariuszach o wysokiej współbieżności.

  3. Identyfikatory Snowflake: Opracowane przez Twittera, te identyfikatory łączą znacznik czasu i numer roboczy, aby generować unikalne identyfikatory w systemach rozproszonych.

  4. ULID (Uniwersalny Unikalny Identyfikator Sortowalny Leksykograficznie): Nowsza alternatywa, która ma być bardziej przyjazna dla ludzi i sortowalna niż UUID.

Historia

Koncepcja UUID została po raz pierwszy wprowadzona w Apollo Network Computing System, a następnie standaryzowana przez Open Software Foundation (OSF) jako część Środowiska Rozproszonego Obliczeń (DCE) w latach 90-tych. Początkowa specyfikacja została opublikowana w 1997 roku jako ISO/IEC 11578:1996, a następnie zrewidowana w 2005 roku jako część ISO/IEC 9834-8:2005.

Kluczowe wydarzenia w historii UUID:

  • Lata 80.: Apollo Computer rozwija koncepcję UUID dla swojego systemu obliczeń sieciowych.
  • 1997: Pierwsza specyfikacja UUID opublikowana jako ISO/IEC 11578:1996.
  • 2005: Specyfikacja UUID zrewidowana i opublikowana jako część ISO/IEC 9834-8:2005.
  • 2009: RFC 4122 definiuje format UUID i algorytmy generacji używane dzisiaj.

Z biegiem czasu UUID stały się niezbędnym narzędziem w systemach rozproszonych i projektowaniu baz danych, z różnymi implementacjami i adaptacjami w różnych językach programowania i platformach.

Przykłady kodu

Oto przykłady generowania UUID w różnych językach programowania:

import uuid

## Generowanie UUID wersji 4 (losowego)
random_uuid = uuid.uuid4()
print(f"UUID wersji 4: {random_uuid}")

## Generowanie UUID wersji 1 (opartego na czasie)
time_based_uuid = uuid.uuid1()
print(f"UUID wersji 1: {time_based_uuid}")
const { v1: uuidv1, v4: uuidv4 } = require('uuid');

// Generowanie UUID wersji 4 (losowego)
const randomUuid = uuidv4();
console.log(`UUID wersji 4: ${randomUuid}`);

// Generowanie UUID wersji 1 (opartego na czasie)
const timeBasedUuid = uuidv1();
console.log(`UUID wersji 1: ${timeBasedUuid}`);
import java.util.UUID;

public class UuidGenerator {
    public static void main(String[] args) {
        // Generowanie UUID wersji 4 (losowego)
        UUID randomUuid = UUID.randomUUID();
        System.out.println("UUID wersji 4: " + randomUuid);

        // Generowanie UUID wersji 1 (opartego na czasie)
        UUID timeBasedUuid = UUID.fromString(new com.eaio.uuid.UUID().toString());
        System.out.println("UUID wersji 1: " + timeBasedUuid);
    }
}
require 'securerandom'

## Generowanie UUID wersji 4 (losowego)
random_uuid = SecureRandom.uuid
puts "UUID wersji 4: #{random_uuid}"

## Ruby nie ma wbudowanej metody dla UUID wersji 1
## Należy użyć gemu takiego jak 'uuidtools' do tego
<?php
// Generowanie UUID wersji 4 (losowego)
$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 "UUID wersji 4: " . $randomUuid . "\n";

// PHP nie ma wbudowanej metody dla UUID wersji 1
// Należy użyć biblioteki takiej jak 'ramsey/uuid' do tego
?>

Odniesienia

  1. Leach, P., Mealling, M., & Salz, R. (2005). A Universally Unique IDentifier (UUID) URN Namespace. RFC 4122. https://tools.ietf.org/html/rfc4122
  2. Międzynarodowa Organizacja Normalizacyjna. (2005). Technologie informacyjne – Otwarte systemy łączności – Procedury działania organów rejestracyjnych OSI: Generacja i rejestracja Uniwersalnych Unikalnych Identyfikatorów (UUID) oraz ich użycie jako komponentów identyfikatorów obiektów ASN.1. ISO/IEC 9834-8:2005. https://www.iso.org/standard/62795.html
  3. Uniwersalny unikalny identyfikator. (2023). W Wikipedii. https://en.wikipedia.org/wiki/Universally_unique_identifier
  4. Identyfikator Snowflake. (2023). W Wikipedii. https://en.wikipedia.org/wiki/Snowflake_ID
  5. Specyfikacja ULID. (n.d.). GitHub. https://github.com/ulid/spec
Feedback