Generator UUID online - v4, v7 i GUID

Kryptograficznie losowe, uniwersalnie unikalne identyfikatory. Wersja 7 zawiera znacznik czasu, więc sortuje się chronologicznie.

Wszystko liczy się w Twojej przeglądarce - dane nie są wysyłane na nasz serwer.

Ustawienia generatora
Wersja identyfikatora

Zapis
Kliknij „Generuj”, a lista pojawi się poniżej.
Wygenerowane identyfikatory
    Lista jest pusta.
    Walidator UUID
    Wklej wartość, a rozpoznamy jej wersję i wariant.
    Wersje UUID w skrócie
    WersjaŹródłoSortowalny
    v1czas + adres MACczęściowo
    v3skrót MD5 nazwynie
    v4losowośćnie
    v5skrót SHA-1 nazwynie
    v7czas + losowośćtak

    Wersje 1-5 opisywał RFC 4122. Od maja 2024 obowiązuje RFC 9562, który dodał wersje 6, 7 i 8, a wersję 1 odradza ze względu na ujawnianie adresu karty sieciowej.

    Budowa UUID
    Długość36 znaków z myślnikami
    Bity łącznie128
    Bity wersji4 (13. znak)
    Bity wariantu2 (17. znak)
    Losowość w v4122 bity
    Losowość w v774 bity + czas

    Trzynasty znak zawsze pokazuje wersję, a siedemnasty należy do zbioru 8, 9, a lub b, gdy identyfikator jest zgodny ze standardem.

    Jak używać

    1. Wybierz wersję identyfikatora - przycisk v4 daje ciąg czysto losowy, v7 układa kolejne identyfikatory chronologicznie.
    2. Wpisz, ile identyfikatorów wygenerować, od jednego do tysiąca, i kliknij „Generuj”.
    3. Przełącznikami zapisu dobierz postać wyniku. Nawiasów klamrowych wymagają narzędzia z ekosystemu Microsoftu, zapisu bez myślników - starsze bazy danych o krótkim polu tekstowym.
    4. Przy każdej pozycji jest przycisk kopiowania. Przyciski „Kopiuj wszystkie” i „Pobierz TXT” zabierają całą listę naraz.
    5. Przycisk „UUID zerowy” wstawia identyfikator złożony z samych zer. W danych testowych oznacza on brak przypisania.
    6. W walidatorze na dole wklej dowolny identyfikator, a rozpoznamy jego wersję i wariant, przy wersji 7 też zapisany w nim czas utworzenia.

    Wskazówki

    • Losowość w wersji 4 pochodzi z crypto.getRandomValues, czyli z kryptograficznego generatora liczb losowych systemu operacyjnego. Math.random do identyfikatorów się nie nadaje, bo jego wyniki da się przewidzieć po kilku obserwacjach.
    • Znacznik czasu w wersji 7 obejmuje pierwsze 48 bitów i liczy milisekundy od 1 stycznia 1970 roku. Identyfikatory posortowane jako zwykły tekst są wtedy uporządkowane chronologicznie, a zapytania o najnowsze rekordy obchodzą się bez osobnego indeksu po dacie.
    • Identyfikatory v7 wygenerowane w tej samej milisekundzie rozróżniamy licznikiem w kolejnych 12 bitach, tak jak sugeruje RFC 9562. Bez tego kolejność w obrębie milisekundy byłaby przypadkowa.
    • Prawdopodobieństwo powtórzenia dwóch UUID v4 jest pomijalnie małe. Żeby szansa na kolizję sięgnęła jednego procenta, musiałbyś wygenerować około 3 · 10¹⁷ identyfikatorów, więc sprawdzanie unikalności przed zapisem jest zbędną pracą.
    • Zapis bez myślników zajmuje 32 znaki i bywa wymagany przez starsze systemy. Nawiasy klamrowe to konwencja rejestru systemu Windows i bibliotek COM.

    Potrzebujesz losowego ciągu, który człowiek ma przepisać? Lepszy będzie generator haseł. Chcesz zamienić identyfikator na inną postać? Zajrzyj do konwertera systemów liczbowych.

    Czym jest UUID i dlaczego bywa nazywany GUID

    UUID, czyli universally unique identifier, to 128-bitowa liczba zapisywana jako 32 znaki szesnastkowe w pięciu grupach rozdzielonych myślnikami. Cały pomysł opiera się na jednym założeniu. Identyfikator powstaje lokalnie, bez pytania serwera ani bazy danych o kolejny numer, a mimo to prawdopodobieństwo kolizji z już istniejącym jest znikome.

    W dokumentacji Microsoftu ten sam format nosi nazwę GUID, od globally unique identifier. Obie nazwy opisują tę samą 128-bitową liczbę i w praktyce używa się ich wymiennie, z tą różnicą, że narzędzia Microsoftu częściej zapisują ją w nawiasach klamrowych.

    Rozwiązuje to konkretny problem znany z autonumeracji. Przy sekwencji w bazie identyfikator powstaje dopiero po zapisie rekordu, więc aplikacja musi czekać na odpowiedź. Uniwersalnie unikalne identyfikatory istnieją od razu, można je przypisać w przeglądarce i wysłać w komplecie z danymi. W systemach rozproszonych, gdzie kilkanaście usług zapisuje dane niezależnie od siebie i żadna nie ma pewności, która zdąży pierwsza, wspólny licznik stałby się wąskim gardłem, więc każdy węzeł generuje identyfikatory sam, a scalenie zbiorów sprowadza się do zwykłego złączenia tabel.

    Wersja 4 i kryptograficzny generator liczb losowych

    W wersji 4 losowe są wszystkie bity poza sześcioma. Cztery z nich kodują numer wersji, dwa wariant. Zostaje 122 bity losowości, czyli około 5,3 · 10³⁶ możliwych kombinacji. Skalę łatwiej wyczuć na przykładzie, bo gdyby na całym świecie powstawał miliard identyfikatorów na sekundę, pierwszego powtórzenia można by się spodziewać dopiero po mniej więcej 85 latach.

    O bezpieczeństwie takiego identyfikatora decyduje źródło losowości, a generator liczb losowych używany w tym narzędziu pochodzi z systemu operacyjnego i jest przeznaczony do zastosowań kryptograficznych. Implementacje oparte na zwykłym generatorze pseudolosowym bywały w przeszłości źródłem realnych podatności, bo znając kilka wyników, dało się przewidzieć kolejne, a UUID często pełni funkcję tajnego odnośnika do zasobu.

    Wersja 7 i identyfikator, który się sortuje

    Jako klucz główny w bazie danych wersja 4 ma jedną poważną wadę. Indeks typu B-drzewo lubi wartości rosnące, bo nowe rekordy trafiają wtedy na koniec i strony indeksu wypełniają się równo. Losowy UUID wstawia się w przypadkowe miejsca, więc baza raz po raz dzieli zapełnione strony, indeks rośnie szybciej i gorzej mieści się w pamięci podręcznej. Przy dużych tabelach różnica w szybkości wstawiania bywa kilkukrotna.

    Wersja 7, opisana w RFC 9562 z maja 2024 roku, rozwiązuje to prosto. Pierwsze 48 bitów zajmuje znacznik czasu w milisekundach, kolejnych sześć przypada na wersję i wariant, a pozostałe 74 bity pochodzą z generatora losowego. Identyfikatory rosną w czasie, więc zachowują się w indeksie jak zwykła autonumeracja, a nadal powstają po stronie aplikacji. Cena jest jedna i widać ją od razu, bo z identyfikatora v7 da się odczytać moment jego utworzenia z dokładnością do milisekundy. Tam, gdzie to problem, wersja 4 pozostaje właściwym wyborem.

    Jak rozpoznać wersję i wariant

    Wersja siedzi w pierwszym znaku trzeciej grupy, czyli w trzynastym znaku całego zapisu. Jeżeli widzisz tam czwórkę, masz UUID v4; siódemka oznacza v7. Wariant kodują dwa najstarsze bity dziewiątego bajtu, czyli siedemnasty znak zapisu, i dla standardu opisanego w RFC musi to być 8, 9, a albo b. Znaki spoza tego zbioru wskazują na identyfikator ze starszej specyfikacji Microsoftu albo na błąd generatora.

    Walidator w tym narzędziu sprawdza jedno i drugie, a przy wersji 7 odczytuje znacznik czasu i pokazuje datę utworzenia. To wygodny sposób na zorientowanie się, z jakiego okresu pochodzi rekord, gdy w bazie nie ma osobnej kolumny z datą.

    Gdzie używa się identyfikatorów UUID

    Najczęstsze zastosowanie to klucz główny w bazie danych, ale UUID rozszedł się daleko poza bazy. W API klient tworzy zasób i sam nadaje mu identyfikator, więc powtórzone żądanie po zerwanym połączeniu nie zakłada drugiego rekordu. W kolejkach komunikatów identyfikator wiadomości odróżnia powtórkę od nowego zdarzenia.

    Druga duża grupa zastosowań to korelacja logów. Usługa, która przyjmuje żądanie, nadaje mu identyfikator i przekazuje go dalej w nagłówku, a każdy kolejny komponent dopisuje ten sam ciąg do swoich wpisów. Prześledzenie jednej operacji przez kilkanaście maszyn sprowadza się wtedy do wyszukania jednego ciągu znaków, a oprogramowanie do zbierania logów zwykle rozpoznaje taki nagłówek samo. Poza serwerownią te same identyfikatory trafiają do nazw plików przesyłanych przez użytkowników i oznaczają pojedynczą instalację programu na komputerze. Sam identyfikator nie niesie żadnej informacji o osobie, bo w wersji 4 są to wyłącznie losowe bity.

    UUID zerowy i jego zastosowania

    Identyfikator złożony wyłącznie z zer jest w standardzie wyróżniony jako nil UUID. Formalnie nie ma ani wersji, ani wariantu, a mimo to pozostaje zapisem zgodnym ze specyfikacją. Używa się go tam, gdzie potrzebna jest wartość oznaczająca „brak identyfikatora”, a typ kolumny nie dopuszcza wartości pustej, na przykład w danych testowych albo jako wartość domyślna przed przypisaniem właściwego klucza.

    RFC 9562 definiuje też wartość przeciwną, złożoną z samych znaków f, nazywaną max UUID. Bywa przydatna jako górna granica przy zapytaniach zakresowych po kluczu głównym.

    Najczęstsze pytania

    Czy te identyfikatory są naprawdę losowe?

    Losowość pochodzi z crypto.getRandomValues, czyli z kryptograficznego generatora liczb losowych systemu operacyjnego, tego samego, którego przeglądarka używa do połączeń szyfrowanych. Math.random nie bierze w tym udziału. Generowanie odbywa się w całości na Twoim urządzeniu, a wygenerowane identyfikatory nie są nigdzie wysyłane ani zapisywane.

    v4 czy v7 - co wybrać?

    Jeśli identyfikator ma być kluczem głównym w bazie danych albo elementem posortowanej listy, wybierz v7. Wstawianie do indeksu będzie szybsze, a rekordy ułożą się chronologicznie i dadzą się przeglądać zakresami po samym kluczu. Jeśli identyfikator ma trafić do adresu URL i pełnić funkcję trudnego do odgadnięcia odnośnika, wybierz v4, bo v7 zdradza czas utworzenia.

    Czy dwa wygenerowane UUID mogą być takie same?

    Teoretycznie tak, praktycznie nie. Przy 122 bitach losowości szansa na kolizję staje się zauważalna dopiero po wygenerowaniu liczby identyfikatorów rzędu 10¹⁸. Żaden realny system nie zbliża się do tej skali, więc sprawdzanie unikalności przed zapisem jest zbędne.

    Czy identyfikator z samych zer jest poprawnym UUID?

    Wartość 00000000-0000-0000-0000-000000000000 jest poprawna. RFC 9562 opisuje ją jako nil UUID, choć nie ma ona ani numeru wersji, ani wariantu, więc walidator oznacza ją osobno zamiast przypisywać do wersji 4 albo 7. W bazie danych służy jako oznaczenie braku przypisania tam, gdzie kolumna nie dopuszcza pustego pola.

    Czym jest uuid_generate_v4() w PostgreSQL?

    To funkcja z rozszerzenia uuid-ossp, która zwraca losowy identyfikator w wersji 4. Od PostgreSQL 13 to samo robi wbudowane gen_random_uuid(), bez instalowania rozszerzenia. Obie wykonują się na serwerze bazy, więc identyfikator powstaje dopiero przy zapisie rekordu. Kiedy potrzebujesz go wcześniej, po stronie aplikacji, wygeneruj go tutaj albo funkcją crypto.randomUUID w przeglądarce.

    Jak wygenerować UUID v7 we własnym kodzie?

    W tym narzędziu wystarczy przełącznik v7. W kodzie sięgnij po bibliotekę zgodną z RFC 9562, bo funkcje wbudowane zwykle zwracają wersję 4, tak jak crypto.randomUUID w przeglądarce i w Node.js. Algorytm jest na tyle prosty, że da się go napisać samodzielnie z 48 bitów czasu uniksowego w milisekundach, czterech bitów wersji, dwóch bitów wariantu i 74 bitów z generatora kryptograficznego.

    Do czego służy zapis bez myślników i w nawiasach klamrowych?

    Krótszy zapis, bez myślników, zajmuje 32 zamiast 36 znaków i bywa wymagany przez starsze bazy o ograniczonej długości pola. Nawiasy klamrowe to konwencja rejestru systemu Windows i bibliotek COM, w których ten sam format nosi nazwę GUID. Wszystkie trzy warianty opisują ten sam identyfikator.

    Czy da się odzyskać czas z UUID v4?

    Nie, bo w wersji 4 nie ma żadnej informacji o czasie, są tam wyłącznie losowe bity. Odczytać datę można tylko z wersji 1, 6 i 7. Nasz walidator robi to dla wersji 7; przy wersji 4 poinformuje, że taka informacja nie istnieje.

    Ile identyfikatorów mogę wygenerować naraz?

    Tysiąc. Ograniczenie wynika z wygody, bo dłuższa lista nie mieści się rozsądnie na ekranie, a jej wyświetlenie zaczyna obciążać przeglądarkę. Jeśli potrzebujesz więcej, wygeneruj kilka partii i pobierz każdą jako plik TXT, a pliki tekstowe łatwo połączysz.