UUID — co to jest, czym różni się v4 od v7 i czy może się powtórzyć
Unikalne identyfikatory, które można tworzyć bez centralnego licznika. Wyjaśniamy budowę UUID, prawdopodobieństwo kolizji i dlaczego nowa wersja 7 lepiej sprawdza się w bazach danych.
UUID (Universally Unique Identifier, w świecie Microsoftu GUID) to 128-bitowy identyfikator zapisywany jako 32 cyfry szesnastkowe w pięciu grupach:
550e8400-e29b-41d4-a716-446655440000
Każdy system może generować UUID samodzielnie, bez pytania serwera o kolejny numer — a mimo to praktycznie nie ma ryzyka, że dwa identyfikatory się powtórzą.
Budowa
Pierwsza cyfra trzeciej grupy oznacza wersję (w przykładzie 4), a pierwsza cyfra czwartej grupy — wariant (8, 9, a lub b dla standardowych UUID według RFC 9562). Pozostałe bity zależą od wersji.
Najważniejsze wersje
| Wersja | Zawartość | Zastosowanie |
|---|---|---|
| v1 | czas + adres MAC | starsze systemy; ujawnia sprzęt i czas |
| v4 | 122 losowe bity | najpopularniejsza, uniwersalna |
| v5 | skrót SHA-1 z nazwy | ten sam UUID dla tej samej nazwy |
| v7 | czas Unix w ms + losowe bity | klucze w bazach danych, sortowanie po czasie |
Czy UUID v4 może się powtórzyć?
Teoretycznie tak, praktycznie nie. Jest 2¹²² ≈ 5,3 × 10³⁶ możliwych wartości. Żeby szansa choćby jednej kolizji wyniosła 50%, trzeba wygenerować ok. 2,7 × 10¹⁸ identyfikatorów — to miliard UUID na sekundę przez ponad 85 lat. Warunek: generator musi korzystać z dobrego źródła losowości (w przeglądarce crypto.randomUUID() lub crypto.getRandomValues(), a nie Math.random()).
Dlaczego v7 w bazach danych
Losowe UUID v4 jako klucz główny trafiają w przypadkowe miejsca indeksu. W dużych tabelach (np. MySQL InnoDB, gdzie dane są ułożone według klucza głównego) powoduje to częste dzielenie stron indeksu i wolniejsze zapisy. UUID v7 zaczyna się od znacznika czasu w milisekundach, więc kolejne identyfikatory rosną — jak licznik AUTO_INCREMENT, ale bez centralnego licznika. Dodatkowo z UUID v7 można odczytać przybliżony czas utworzenia rekordu (zobacz czas Unix).
Przechowywanie
- jako tekst: 36 znaków (z myślnikami),
- binarnie: 16 bajtów (np.
BINARY(16)w MySQL, typuuidw PostgreSQL) — oszczędniej i szybciej.
UUID to nie hasło
UUID v4 jest trudny do odgadnięcia, ale nie powinien zastępować tokenów bezpieczeństwa i haseł — może trafiać do logów, adresów URL i historii przeglądarki. UUID v1 i v7 ujawniają czas utworzenia.
Identyfikatory v4 i v7 — pojedynczo lub hurtem — wygenerujesz w generatorze UUID, który sprawdzi też wersję podanego identyfikatora.
Narzędzia do tego poradnika
UUIDGUIDidentyfikatorbaza danychUUIDv7