UUID v1 vs v4 vs v5: Której Wersji Powinieneś Używać?
Szybka odpowiedź
Używaj UUID v4 (random) domyślnie —nie wymaga koordynacji i ma znikome ryzyko kolizji. Używaj v1 (time-based) tylko gdy potrzebujesz time-orderable ID i możesz zabezpieczyć node ID. Używaj v5 (namespace+name) dla deterministycznych ID. Generuj każdą wersję naszym darmowym UUID Generator.
Wstęp
UUID (Universally Unique Identifier) to 128-bitowy identyfikator renderowany jako 36 znaków w grupach 8-4-4-4-12 hex, np. 123e4567-e89b-12d3-a456-426614174000. RFC 9562 definiuje kilka wersji; trzy najpowszechniejsze to v1 (time + MAC), v4 (random) i v5 (namespace + name, SHA-1). Każda robi różne trade-offi między gwarancjami unikalności, sortowalnością i determinizmem.
Krok po kroku
-
UUID v1 — w oparciu o czas i węzeł
v1 koduje bieżący 60-bitowy znacznik czasu (interwały 100 ns od 1582-10-15) i 48-bitowy identyfikator węzła (zwykle adres MAC). Identyfikatory generowane w tym samym węźle rosną monotonicznie i można je sortować według czasu. Ryzyko: adres MAC powoduje wyciek tożsamości sprzętu, a przesunięcie zegara między węzłami może zakłócić porządek.
-
UUID v4 — losowo
v4 wykorzystuje 122 losowe bity (6 bitów jest stałych dla wersji/wariantu). Przy 122 losowych bitach prawdopodobieństwo kolizji między 2,71 biliona identyfikatorów wynosi 50% — przy każdym realistycznym obciążeniu szansa ta wynosi w rzeczywistości zero. wersja 4 nie wymaga koordynacji i nie ujawnia żadnych informacji o hoście, co czyni ją najbezpieczniejszą opcją domyślną.
-
UUID v5 —przestrzeń nazw i nazwa (SHA-1)
v5 miesza przestrzeń nazw UUID i ciąg nazwy za pomocą SHA-1, aby utworzyć deterministyczny 128-bitowy identyfikator. Ta sama para (przestrzeń nazw, nazwa) zawsze daje ten sam UUID, co jest idealne do deduplikacji i stabilnych identyfikatorów wyprowadzanych z kluczy naturalnych. v3 to ten sam pomysł, ale używa MD5 (unikaj tego).
-
Porównaj kompromisy
v1 można sortować, ale przecieka MAC i wymaga synchronizacji zegara. v4 jest losowy i prywatny, ale nie można go sortować. wersja 5 jest deterministyczna i umożliwia deduplikację, ale nie jest losowa — odgadnięcie nazwy pozwala atakującemu odtworzyć plik UUID. Wybierz w zależności od tego, czy potrzebujesz uporządkowania, losowości czy determinizmu.
-
Wybierz odpowiednią wersję dla swojego przypadku
Klucze podstawowe bazy danych: v4 (lub v7 w nowszych systemach w celu uporządkowania czasowego). Systemy rozproszone bez koordynacji: v4. Deterministyczne identyfikatory z klucza naturalnego (np. URL →UUID): v5. Dzienniki audytu korzystające z kolejności czasowej: wersja 1 z zabezpieczonym losowym identyfikatorem węzła.
Przykłady
UUID v1 (na podstawie czasu, z możliwością sortowania)
Wejście: Wygenerowano o 2026-08-28T12:00:00Z w węźle 00:11:22:33:44:55
Wyjście: 1ef7c1d0-2d3b-11f0-8000-001122334455 (cyfra wersji „1”, sortowanie według czasu)
UUID v4 (losowo)
Wejście: Random generation
Wyjście: f47ac10b-58cc-4372-a567-0e02b2c3d479 (cyfra wersji „4”, bity losowe)
UUID v5 (deterministyczny z przestrzeni nazw+nazwy)
Wejście: Przestrzeń nazw DNS (6ba7b810-9dad-11d1-80b4-00c04fd430c8) + nazwa „freeonlinetoolsgo.com”
Wyjście: 74738ff5-5367-5958-9aeb-0c1f1f1f1f1f (to samo wejście zawsze daje to samo wyjście)
Typowe problemy
- Przechowywanie identyfikatorów UUID jako VARCHAR(36) zamiast natywnego 16-bajtowego typu BINARY/UUID: marnuje to dwukrotnie pamięć i pogarsza wydajność indeksu. Jeśli to możliwe, użyj natywnego typu kolumny UUID.
- Używanie wersji 1 bez zabezpieczenia identyfikatora węzła: domyślny adres MAC powoduje wyciek tożsamości sprzętowej i stanowi zagrożenie dla prywatności. Zastąp go kryptograficznie losową wartością 48-bitową na węzeł.
- Zakładając, że kolizje v4 są niemożliwe: nie są — są po prostu astronomicznie mało prawdopodobne. Przy 122 losowych bitach potrzebujesz ~ 2,71 biliona identyfikatorów, aby uzyskać 50% szansy. Dla 1 miliarda identyfikatorów szansa wynosi ~0,000000000000001.
- Używanie wersji v3 (opartej na MD5) zamiast v5 (opartej na SHA-1): MD5 jest zepsuty, dlatego preferowana jest wersja v5. Oba są deterministyczne, ale v5 ma większą odporność na kolizje.
Porady
- Domyślnie v4 dla prawie każdego przypadku użycia — jest losowy, prywatny i odporny na kolizje bez żadnej koordynacji.
- Jeśli potrzebujesz losowych identyfikatorów sortowanych według czasu, spójrz na UUID v7 (RFC 9562, 2024), który łączy uniksowy znacznik czasu z losowymi bitami — lepiej niż v1 w przypadku nowoczesnych baz danych.
- Użyj wersji 5, aby wygenerować stabilne identyfikatory z kluczy naturalnych (URLs, adresy e-mail), aby te same dane wejściowe zawsze były mapowane na ten sam UUID — przydatne do deduplikacji i idempotentu APIs.
- Jeśli to możliwe, generuj identyfikatory UUID na kliencie, aby uniknąć konieczności przesyłania danych do serwera — nasz generator UUID działa całkowicie w przeglądarce za pomocą funkcji crypto.getRandomValues().