UUID to prosty sposób nadawania rekordom, obiektom i zdarzeniom identyfikatorów, które można generować niezależnie od jednej bazy czy jednego serwera. W praktyce przydaje się w API, systemach rozproszonych, integracjach i wszędzie tam, gdzie kilka komponentów tworzy dane równolegle. Pokażę, czym dokładnie jest ten format, jak czytać jego zapis, czym różnią się najważniejsze wersje i kiedy naprawdę daje przewagę, a kiedy lepiej zostać przy prostszym identyfikatorze.
Najważniejsze rzeczy o UUID w kilku punktach
- UUID ma 128 bitów i nie wymaga centralnej rejestracji, więc dobrze działa tam, gdzie wiele usług tworzy dane równolegle.
- Najczęściej widzisz go w zapisie tekstowym z 36 znakami, czyli 32 cyframi szesnastkowymi i 4 myślnikami.
- W nowych projektach najczęściej wygrywa UUIDv4 albo UUIDv7, zależnie od tego, czy ważniejsza jest losowość, czy porządek czasowy.
- UUIDv4 jest losowy, a UUIDv7 łączy znacznik czasu z losowością, co pomaga przy sortowaniu i indeksach.
- UUID nie jest tokenem bezpieczeństwa i nie powinien zastępować normalnego mechanizmu autoryzacji.
UUID co to i po co w ogóle istnieje
UUID, czyli Universally Unique Identifier, to 128-bitowy identyfikator zaprojektowany po to, by był unikalny bez udziału centralnego numeratora. W standardzie RFC 9562, który dziś wyznacza kierunek dla tego formatu, UUID jest też znany jako GUID w ekosystemie Microsoftu. Najważniejsza cecha nie polega na magicznej „niepowtarzalności”, tylko na tym, że dobrze zaprojektowany generator daje unikalność w praktyce bez synchronizacji między systemami.
Ja zwykle tłumaczę UUID tak: to sposób na rozdzielenie problemu „kto nadaje numer” od problemu „jak ten numer przechowywać i używać”. Dzięki temu identyfikator może powstać w aplikacji mobilnej, mikroserwisie, workerze w kolejce albo na serwerze API, a potem trafić do bazy bez ryzyka konfliktu z numeracją z innego miejsca. To właśnie dlatego UUID tak dobrze pasuje do aplikacji rozproszonych, integracji i scenariuszy offline.Warto też odróżnić „unikalny” od „sekretny”. UUID może być trudny do odgadnięcia, ale sam w sobie nie jest mechanizmem ochronnym. Jeśli identyfikator ma chronić dostęp do zasobu, potrzebujesz osobnej warstwy autoryzacji. Żeby jednak dobrze użyć UUID, trzeba jeszcze zrozumieć, jak wygląda jego zapis i dlaczego wersja ma znaczenie.

Jak wygląda zapis UUID i dlaczego nie wszystkie identyfikatory działają tak samo
W praktyce UUID najczęściej zobaczysz jako ciąg w stylu acde070d-8c4c-4f0d-9d8a-162843c10333. To 32 cyfry szesnastkowe podzielone na 5 grup, zwykle w układzie 8-4-4-4-12, czyli razem 36 znaków z myślnikami. Część bitów mówi, z której wersji UUID korzystasz, a część określa wariant, czyli reguły interpretacji wewnętrznego układu danych.
To nie jest czysta kosmetyka. Inny wariant albo inna wersja oznacza inny sposób generowania identyfikatora, a co za tym idzie, inne własności w bazie danych, inne ryzyko ujawniania informacji i inne zachowanie przy sortowaniu. Jeśli patrzysz na UUID wyłącznie jak na „dziwny losowy string”, łatwo przeoczyć różnicę między wersją nastawioną na losowość a wersją zaprojektowaną pod porządek czasowy.
| Wersja | Jak powstaje | Kiedy ma sens | Na co uważać |
|---|---|---|---|
| v1 | Oparta na czasie i identyfikatorze węzła | Starsze systemy i kompatybilność z dawnymi implementacjami | Może ujawniać czas i informacje o maszynie, więc nie jest moim pierwszym wyborem |
| v3 | Hash MD5 z przestrzeni nazw i nazwy | Gdy potrzebujesz deterministycznego ID z tej samej nazwy | To rozwiązanie historyczne, a nie domyślny wybór do nowych systemów |
| v4 | Losowe lub pseudolosowe 122 bity po odjęciu bitów wersji i wariantu | Proste, uniwersalne identyfikatory bez dodatkowych wymagań | Nie niesie porządku czasowego, więc słabiej współgra z indeksami opartymi o kolejność insercji |
| v5 | Hash SHA-1 z przestrzeni nazw i nazwy | Deterministyczne identyfikatory tam, gdzie liczy się powtarzalność | To nadal hash-based UUID, a nie losowy identyfikator |
| v6 | Wersja czasowa przebudowana pod lepszą lokalność danych | Migracje ze starszych systemów opartych o v1 | W nowych projektach zwykle i tak lepiej celować w v7 |
| v7 | 48-bitowy znacznik czasu w milisekundach plus losowość | Nowe systemy, bazy danych, eventy, kolejki, dane sortowane chronologicznie | Warto pilnować monotoniczności generatora przy dużej liczbie zapisów w tej samej milisekundzie |
| v8 | Format eksperymentalny lub vendor-specific | Gdy sam kontrolujesz reguły generowania i naprawdę wiesz, po co to robisz | Unikalność zależy od implementacji, więc nie zakładaj jej automatycznie |
Gdzie UUID naprawdę pomaga w aplikacjach i bazach danych
UUID nie jest rozwiązaniem na każdy problem, ale w kilku scenariuszach po prostu robi robotę lepiej niż licznik z bazy. Najbardziej widać to tam, gdzie wiele miejsc może tworzyć rekordy równolegle, a potem dane trzeba połączyć bez ręcznego pilnowania zakresów numerów.
- Publiczne API - identyfikator może powstać od razu po stronie usługi, bez czekania na centralny numer. To upraszcza tworzenie zasobów i zmniejsza zależność od jednej bazy.
- Systemy rozproszone - jeśli kilka mikroserwisów albo workerów zapisuje dane równolegle, UUID ogranicza ryzyko kolizji i odpada problem „kto ma przydzielać następny numer”.
- Tryb offline - aplikacja mobilna, klient desktopowy albo edge service może przygotować rekord lokalnie, a synchronizacja nastąpi później bez przepisywania kluczy głównych.
- Scalanie danych z wielu źródeł - przy migracjach, integracjach i replikacji UUID łatwiej zachowuje spójność niż sekwencja generowana lokalnie w jednej tabeli.
- Zdarzenia i kolejki - dla eventów, jobów i wiadomości UUID bywa naturalnym identyfikatorem technicznym, bo nie wymaga wspólnego licznika między producentami.
Jest też druga strona medalu. Jeśli identyfikator ma być krótki, czytelny dla człowieka i łatwy do ręcznego wpisania, UUID bywa po prostu zbyt ciężki. W panelu administracyjnym, w kodzie referencyjnym dla klienta albo w numeracji zamówień często lepiej sprawdza się osobny, biznesowy identyfikator. Właśnie dlatego warto zestawić UUID z innymi popularnymi sposobami nadawania identyfikatorów.
UUID kontra auto increment i inne identyfikatory
Najwięcej nieporozumień bierze się z porównania UUID z auto increment. To nie są konkurencyjne „lepsze i gorsze” rozwiązania, tylko dwa różne kompromisy. Ja zwykle patrzę na nie przez pryzmat skali systemu, liczby źródeł zapisu i tego, czy identyfikator ma coś zdradzać o kolejności danych.
| Rozwiązanie | Zalety | Wady | Kiedy wybrać |
|---|---|---|---|
| UUID | Tworzenie bez centralnego licznika, łatwe scalanie systemów, dobra przenośność | Dłuższy zapis, większe indeksy, słabsza czytelność dla człowieka | Systemy rozproszone, integracje, publiczne API, wiele niezależnych writerów |
| Auto increment | Prosty, mały, naturalnie uporządkowany w jednej bazie | Zależność od jednej instancji, trudniejsze scalanie, łatwe zgadywanie kolejnych wartości | Proste aplikacje z jedną bazą i bez potrzeby synchronizacji między systemami |
| GUID | To praktycznie ten sam typ identyfikatora, tylko inna nazwa w ekosystemie Microsoftu | Może mieszać nazewnictwo w zespole, jeśli nie ustalicie wspólnego języka | Gdy pracujesz w narzędziach Microsoftu i ta terminologia jest już standardem |
| ULID lub podobne identyfikatory sortowalne | Lepsza lokalność czasowa i bardziej przyjazny zapis niż klasyczny UUID | To osobny ekosystem, nie standard UUID | Gdy chcesz sortowania po czasie, ale możesz zaakceptować inny format |
Jeśli miałbym sprowadzić to do jednej praktycznej różnicy, powiedziałbym tak: auto increment jest wygodny, kiedy cały świat kręci się wokół jednej bazy, a UUID wygrywa wtedy, gdy granice systemu są bardziej rozmyte. Praktyczny wybór wersji jest więc ważniejszy niż sam fakt, że używasz „jakiegoś UUID”.
Jak wybrać właściwą wersję UUID w 2026 roku
W 2026 roku mój praktyczny skrót jest prosty: jeśli nie masz twardego powodu, wybieraj wersję, która najlepiej pasuje do sposobu zapisu danych, a nie do przyzwyczajenia zespołu. RFC 9562 jasno pokazuje kierunek, a w nowych systemach coraz częściej sensownym defaultem staje się UUIDv7.
Najprostsza reguła wyboru
- UUIDv4 wybieram, gdy potrzebuję po prostu unikalnego identyfikatora i nie chcę myśleć o porządku czasowym.
- UUIDv7 wybieram, gdy identyfikatory mają trafiać do bazy jako klucze i zależy mi na lepszej lokalności danych oraz sortowaniu po czasie.
- UUIDv6 ma sens głównie w migracjach i tam, gdzie ktoś już wcześniej zbudował ekosystem wokół v1.
- UUIDv3 i v5 wybieram tylko wtedy, gdy chcę deterministyczny identyfikator wyprowadzany z nazwy i przestrzeni nazw.
- UUIDv8 zostawiam na przypadki eksperymentalne lub vendor-specific, bo to format dla osób, które naprawdę kontrolują cały proces generowania.
Przeczytaj również: NordVPN - co to jest? Przewodnik dla programistów
Typowe błędy, które widzę najczęściej
- Traktowanie UUID jak sekretu - sam identyfikator nie zastępuje autoryzacji ani nie chroni zasobu.
- Oczekiwanie porządku czasowego od v4 - losowy UUID nie posortuje się sensownie chronologicznie.
- Mieszanie wersji bez planu - w jednym polu trzymaj jedną strategię, bo inaczej utrudniasz indeksowanie i debugowanie.
- Przechowywanie wyłącznie jako tekst - jeśli baza wspiera zapis binarny, 16 bajtów zwykle jest rozsądniejsze niż 36 znaków tekstu.
- Zakładanie, że starsze wersje są równie neutralne prywatnościowo - w odmianach czasowych łatwo ujawnić więcej, niż się wydaje na pierwszy rzut oka.
Ja w nowych systemach najpierw sprawdzam, czy potrzebuję losowości, czy porządku czasowego, a dopiero potem decyduję o wersji. Jeśli baza ma dużo zapisów, UUIDv7 często daje po prostu lepszy kompromis niż v4, bo dane układają się bardziej naturalnie dla indeksów. Z tego punktu łatwo już przejść do krótkiej, praktycznej reguły na koniec.
Co zapamiętać, zanim wrzucisz UUID do schematu bazy
UUID rozwiązuje bardzo konkretny problem: pozwala generować unikalne identyfikatory bez centralnego licznika i bez ryzyka, że dwa niezależne systemy wejdą sobie w drogę. To dlatego tak dobrze pasuje do nowoczesnego developmentu, integracji, event-driven architektury i aplikacji, które nie siedzą już grzecznie przy jednej bazie.
Jeśli potrzebujesz tylko prostego ID, UUIDv4 nadal jest bezpiecznym wyborem. Jeśli jednak budujesz nowy system i liczy się wydajność zapisu, lokalność indeksu i porządek czasowy, UUIDv7 zwykle daje najlepszy balans. Sam format nie zrobi jednak całej pracy za ciebie, bo równie ważne są sposób przechowywania, generowania i to, czy zespół rozumie kompromisy związane z użytym wariantem.
Jeśli miałbym zostawić jedną praktyczną zasadę, brzmiałaby tak: wybieraj UUID wtedy, gdy niezależność generowania ID jest ważniejsza niż krótki, ludzki zapis. W pozostałych przypadkach prostszy identyfikator może być po prostu lepszym narzędziem.