- Typ
- Wersja 7: sortowalna data Unix
- Wariant
- RFC 9562 (dawniej RFC 4122)
- Data utworzenia
- 22 lut 2022, 16:22:22 2022-02-22T19:22:22.000Z · 1645557742000 ms
017f22e2-79b0-7cc3-98c4-dc0c0c07398f017F22E2-79B0-7CC3-98C4-DC0C0C07398F{017F22E2-79B0-7CC3-98C4-DC0C0C07398F}urn:uuid:017f22e2-79b0-7cc3-98c4-dc0c0c07398f01FWHE4YDGFK1SHH6W1G60EECF017f22e279b07cc398c4dc0c0c07398f1989357241971137676463954034883508623AX8i4nmwfMOYxNwMDAc5jw==Jak to działa
UUID to 128-bitowa liczba zapisywana jako 32 cyfry szesnastkowe w pięciu grupach (8-4-4-4-12). Pozwala zidentyfikować rekord bez pytania kogokolwiek, czy wartość jest już zajęta: dwa serwery, dwie aplikacje mobilne lub dwa procesy mogą tworzyć identyfikatory jednocześnie, bez koordynacji i bez kolizji. Format definiuje RFC 9562, który w 2024 roku zastąpił RFC 4122 i dodał wersje 6, 7 i 8.
Cyfra otwierająca trzecią grupę wskazuje wersję, a każda wersja układa bity inaczej. Wersja 4 to czysta losowość. Wersja 7 zaczyna się od daty w milisekundach, więc identyfikatory są posortowane według utworzenia. Wersje 3 i 5 nie mają w sobie nic losowego: powstają z hasha przestrzeni nazw i nazwy, dlatego zawsze dają ten sam wynik. Wersje 1 i 6 zawierają datę z dokładnością do 100 nanosekund i węzeł, którym historycznie był adres MAC komputera.
Analizator działa w odwrotną stronę: odczytuje wersję i wariant, odzyskuje datę z UUID v1, v6 i v7 oraz z ULID i pokazuje tę samą wartość zapisaną jako GUID, URN, szesnastkowo, jako liczba całkowita lub Base64. Wszystko jest liczone w Twojej przeglądarce; żaden identyfikator nie trafia na serwer.
Przykłady
v5 · DNS · www.example.com2ed6657d-e927-568b-95e1-2665a8aea6a2To wektor testowy z RFC 9562. Każda biblioteka poprawnie implementująca wersję 5 musi zwrócić dokładnie tę wartość dla tej nazwy w przestrzeni DNS.017F22E2-79B0-7CC3-98C4-DC0C0C07398F2022-02-22T19:22:22.000ZPierwsze 12 cyfr UUID v7 to milisekundy Unix zapisane szesnastkowo: 0x017F22E279B0 to 1645557742000.C232AB00-9414-11EC-B3C8-9F6BDECED8461EC9414C-232A-6B00-B3C8-9F6BDECED846Ten sam moment jako wersja 1 i jako wersja 6. Wersja 6 przestawia bity daty od najbardziej do najmniej znaczącego, aby tekst sortował się chronologicznie; sekwencja zegara i węzeł się nie zmieniają.01ARZ3NDEKTSV4RRFFQ69G5FAV01563e3a-b5d3-d676-4c61-efb99302bd5bULID zajmuje te same 128 bitów co UUID, więc można go zapisać w kolumnie uuid. Nie ma jednak wersji ani wariantu: czytany jako UUID, te cyfry są częścią losowej wartości.Przypadki użycia
- Tworzenie klucza głównego po stronie klienta lub w kilku usługach naraz, bez czekania, aż baza danych nada wartość autoinkrementacji.
- Generowanie kluczy idempotencji, aby ponowiona płatność lub zamówienie nie zostały przetworzone dwa razy.
- Oznaczanie każdego żądania identyfikatorem korelacji, aby śledzić je w logach kilku mikroserwisów.
- Wyprowadzanie za pomocą v5 stałego identyfikatora z klucza naturalnego (e-mail, URL, SKU), aby dwa systemy doszły do tej samej wartości bez wspólnej tabeli.
- Ustalenie, kiedy utworzono rekord, na podstawie jego UUID v7 lub ULID, gdy pojawi się w logu albo raporcie błędu.
- Wczytanie danych testowych z setkami prawidłowych identyfikatorów za jednym razem.
Najczęstsze pytania
v4 czy v7 jako klucz główny?
v7, chyba że masz powód, by ukryć datę utworzenia. Indeksy B-drzewa przechowują klucze w kolejności, a v4 trafia w dowolne miejsce indeksu: każde wstawienie dotyka innej strony, strony się dzielą, a cache działa gorzej. v7 zawsze trafia na koniec, jak autoinkrementacja. Uwaga na SQL Server: typ uniqueidentifier sortuje, zaczynając od ostatnich sześciu bajtów, więc tam v7 też nie jest sekwencyjny.
Czy dwa UUID v4 mogą się powtórzyć?
Teoretycznie tak, w praktyce nie. v4 ma 122 losowe bity, a żeby osiągnąć 50 % szans na co najmniej jedno powtórzenie, trzeba by wygenerować około 2,7 × 10¹⁸, czyli miliard na sekundę przez ponad 85 lat. Warunkiem jest użycie generatora kryptograficznego: prawdziwe duplikaty, o których się słyszy, biorą się ze źle zainicjowanych ziaren, a nie z matematyki.
Czy UUID i GUID to to samo?
Tak, GUID to nazwa używana przez Microsoft, a tekst jest identyczny; w Windows zwykle pojawia się wielkimi literami i w nawiasach klamrowych. Różnica jest w postaci binarnej: Guid.ToByteArray w .NET zapisuje pierwsze trzy grupy w little-endian, więc czytając te surowe bajty w innym języku, zobaczysz pierwsze cyfry odwrócone.
Czy mogę użyć UUID jako tajnego tokenu?
Dobrze wygenerowany v4 ma 122 nieprzewidywalne bity, co wystarcza na trudny do odgadnięcia link, ale RFC 9562 wyjaśnia, że UUID nie są pomyślane jako dane uwierzytelniające: wiele bibliotek nie gwarantuje generatora kryptograficznego, a wersje 1, 6 i 7 ujawniają datę utworzenia. Do tokenów sesji czy resetu hasła lepiej generować dedykowane losowe bajty.
ULID czy UUID v7?
Niosą niemal te same informacje: 48 bitów milisekund i resztę losową. ULID zapisuje się w 26 znakach bez myślników i niejednoznacznych liter, co jest wygodniejsze w URL. v7 to standardowy UUID, więc mieści się w kolumnach uuid PostgreSQL i w każdym walidatorze bez konwersji. Jeśli zaczynasz od zera, a baza ma typ uuid, wybierz v7.
Dlaczego węzeł moich UUID v1 to nie mój adres MAC?
Ponieważ ujawnienie adresu MAC karty sieciowej pozwala ustalić, który komputer utworzył każdy identyfikator — tak w 1999 roku zidentyfikowano autora wirusa Melissa. RFC 9562 zaleca losowy węzeł z włączonym bitem multicast i to właśnie robi to narzędzie; analizator ostrzega, gdy UUID v1 zawiera prawdziwy adres MAC.