Do czego służy generator UUID

UUID (Universally Unique Identifier) to 128-bitowy identyfikator zapisywany jako 32 cyfry szesnastkowe, np. 550e8400-e29b-41d4-a716-446655440000. Można go utworzyć w dowolnym miejscu, bez pytania bazy danych o kolejny numer, i nie trzeba się martwić, że ktoś inny wygeneruje taki sam. Dlatego UUID służą jako klucze w bazach danych, nazwy przesyłanych plików, identyfikatory zdarzeń i żądań w systemach złożonych z wielu usług.

Generator UUID tworzy identyfikatory w przeglądarce, do tysiąca naraz. Wersje 4, 7 i 1 są zgodne z RFC 9562, czyli standardem, który w 2024 roku zastąpił RFC 4122. Krótsze kody do przepisania, np. vouchery, lepiej utworzyć w generatorze kodów alfanumerycznych.

Jak wygenerować UUID

  1. Wybierz wersję. Jeśli nie wiesz którą, zostaw v4.
  2. Wybierz zapis: standardowy z kreskami, bez kresek, wielkimi literami albo w nawiasach klamrowych.
  3. Ustaw, ile identyfikatorów potrzebujesz, od 1 do 1000.
  4. Kliknij UUID na liście, żeby skopiować tylko jego, albo skopiuj całą listę. Listę możesz też pobrać jako CSV, TXT lub JSON.

Lista zmienia się od razu po zmianie ustawień, a przycisk Generuj nowe UUID tworzy kolejną z tymi samymi ustawieniami.

Którą wersję UUID wybrać

Wersje UUID dostępne w generatorze
Wersja Co zawiera Sortuje się Zastosowanie
v4 losowe bity nie domyślny wybór: identyfikatory obiektów, nazwy plików, tokeny korelacji
v7 czas w ms i losowe bity tak, według czasu klucze główne w bazach danych, zdarzenia, logi
v1 czas i identyfikator węzła nie jako tekst zgodność ze starszymi systemami
NIL same zera nie dotyczy wartość pusta w polu, które musi mieć UUID

UUID v4

Poza cyfrą wersji i wariantu wszystkie bity są losowe, łącznie 122. Z identyfikatora nie da się nic odczytać, ani czasu, ani miejsca powstania. To najczęściej używana wersja i dobry wybór wszędzie tam, gdzie kolejność nie ma znaczenia.

UUID v7

Pierwsze 48 bitów to czas w milisekundach od 1970 roku, dalej jest wersja, licznik i bity losowe. Identyfikatory utworzone później są większe, także porównywane jako zwykły tekst. W tym generatorze kolejne UUID z tej samej milisekundy różnią się licznikiem, więc cała lista jest już posortowana.

UUID v1

Najstarsza wersja czasowa. Zawiera czas w odcinkach 100 nanosekund od 15 października 1582 roku, sekwencję zegara i identyfikator węzła, dawniej adres MAC. Czas jest jednak zapisany od najmłodszych bitów, więc UUID v1 nie układają się alfabetycznie w kolejności powstania. Tę wadę poprawia v7.

RFC 9562 opisuje też wersje 3 i 5, wyliczane z nazwy (np. adresu URL) funkcją MD5 albo SHA-1, wersję 6, czyli v1 z przestawionymi polami czasu, i wersję 8 do własnych zastosowań. Generator ich nie tworzy, bo w praktyce używa się ich rzadko.

Budowa UUID

32 cyfry szesnastkowe dzieli się kreskami na pięć grup po 8, 4, 4, 4 i 12 znaków. Znaczenie większości bitów zależy od wersji, ale dwie cyfry mają stałe miejsce:

Grupy znaków w UUID 550e8400-e29b-41d4-a716-446655440000
Grupa Znaki Znaczenie
550e8400 8 w v4 losowe, w v7 początek znacznika czasu
e29b 4 w v4 losowe, w v7 koniec znacznika czasu
41d4 4 pierwsza cyfra to wersja (tu 4), reszta zależy od wersji
a716 4 pierwsza cyfra to wariant (8, 9, a albo b)
446655440000 12 w v4 i v7 losowe, w v1 identyfikator węzła

Pierwsza cyfra trzeciej grupy to numer wersji, więc po samym zapisie widać, czy UUID jest losowy (4), czasowy (1 albo 7), czy wyliczony z nazwy (3 albo 5). Pierwsza cyfra czwartej grupy to wariant. Wartości 8, 9, a i b oznaczają układ opisany w RFC 9562 i spotyka się je w prawie każdym UUID.

UUID jako klucz w bazie danych

Klucz w postaci UUID można nadać rekordowi, zanim trafi do bazy, np. w aplikacji mobilnej bez dostępu do sieci. Przydaje się to też przy łączeniu danych z kilku baz, bo identyfikatory się nie pokrywają. Ceną jest rozmiar: 16 bajtów zamiast 4 albo 8 bajtów zwykłej liczby.

  • Trzymaj UUID w natywnym typie, np. uuid w PostgreSQL albo BINARY(16) w MySQL. Tekst o długości 36 znaków zajmuje ponad dwa razy więcej miejsca.
  • Losowe v4 trafiają w przypadkowe miejsca indeksu, co przy dużych tabelach spowalnia zapisy. UUID v7 rośnie z czasem, więc nowe wpisy lądują na końcu indeksu, podobnie jak przy kolejnych numerach.
  • Nie traktuj UUID jako zabezpieczenia. Jest trudny do zgadnięcia, ale dostęp do danych i tak powinny sprawdzać uprawnienia.

UUID a GUID

GUID (Globally Unique Identifier) to nazwa, której używa Microsoft, np. w .NET, SQL Server i rejestrze Windows. Chodzi o ten sam 128-bitowy identyfikator. W świecie Microsoftu częściej spotyka się zapis wielkimi literami albo w nawiasach klamrowych, np. {550E8400-E29B-41D4-A716-446655440000}, i oba te zapisy generator potrafi utworzyć.

Różnica pojawia się dopiero przy zapisie binarnym. Metoda Guid.ToByteArray() w .NET zapisuje pierwsze trzy grupy w odwrotnej kolejności bajtów, więc te same 16 bajtów odczytane w innym języku może dać inny tekst. Przy przenoszeniu GUID między systemami najbezpieczniej przekazywać je w postaci tekstowej.

Często zadawane pytania

Czy UUID mogą się powtórzyć?

W teorii tak, w praktyce nie. UUID v4 ma 122 losowe bity, czyli około 5,3 × 10³⁶ możliwości. Żeby szansa na choćby jeden duplikat wyniosła 50%, trzeba wygenerować około 2,7 × 10¹⁸ identyfikatorów, czyli miliard na sekundę przez mniej więcej 86 lat. Powtórki zdarzają się zwykle przez wadliwy generator liczb losowych, nie przez rachunek prawdopodobieństwa.

Którą wersję UUID wybrać?

Gdy nie masz szczególnych wymagań, wybierz v4. Jeśli UUID ma być kluczem głównym w bazie danych albo chcesz sortować identyfikatory według czasu utworzenia, wybierz v7. Wersji 1 używa się dziś głównie dla zgodności ze starszymi systemami.

Czym różni się UUID od GUID?

To ten sam 128-bitowy identyfikator. GUID to nazwa używana przez Microsoft, np. w .NET i SQL Server, gdzie często zapisuje się go wielkimi literami albo w nawiasach klamrowych. UUID to nazwa ze standardu RFC 9562.

Czy UUID nadaje się na klucz główny w bazie danych?

Tak, zwłaszcza gdy identyfikatory powstają w kilku miejscach naraz. Zajmuje 16 bajtów, więcej niż liczba całkowita, i warto go trzymać w typie uuid albo binary(16), a nie jako tekst. Losowe v4 rozrzucają wpisy po całym indeksie, dlatego do kluczy lepiej pasuje v7, który rośnie wraz z czasem.

Jak odczytać czas z UUID v7?

Pierwsze 12 cyfr szesnastkowych to liczba milisekund od 1 stycznia 1970 roku. Wystarczy zamienić je na liczbę dziesiętną i potraktować jako znacznik czasu Unix w milisekundach. Generator pokazuje tę datę przy pierwszym UUID z listy.

Czy UUID v1 zdradza adres MAC komputera?

Klasyczne implementacje wpisywały adres MAC do ostatniej grupy. Ten generator wstawia tam losową wartość z ustawionym bitem multicast, tak jak przewiduje RFC 9562 dla generatorów bez dostępu do adresu sieciowego. Czas utworzenia da się jednak odczytać z każdego UUID v1.

Czym jest NIL UUID?

To UUID złożony z samych zer: 00000000-0000-0000-0000-000000000000. Oznacza brak wartości w polu, które musi mieć UUID. RFC 9562 definiuje też jego odwrotność, Max UUID z samych liter f.

Czy generator wysyła UUID na serwer?

Nie. Identyfikatory powstają w przeglądarce, a losowość pochodzi z funkcji crypto.getRandomValues. Nic nie jest wysyłane ani zapisywane, a po odświeżeniu strony lista znika.