Wszystkie artykuły

UUID: jak generuje się identyfikatory, które prawie nigdy się nie powtarzają

Polski numer PESEL koduje w 11 cyfrach datę urodzenia, płeć i cyfrę kontrolną obliczaną według ustalonego algorytmu — to identyfikator scentralizowany, nadawany przez rejestr państwowy, w którym każda cyfra ma konkretne znaczenie. UUID reprezentuje podejście przeciwne: nie koduje żadnej informacji o swoim pochodzeniu, nie wymaga żadnego centralnego rejestru i może zostać wygenerowany niezależnie na dowolnej maszynie — a mimo to prawdopodobieństwo kolizji pozostaje praktycznie zerowe.

Wersje UUID

  • v1 — na podstawie aktualnego czasu i adresu MAC karty sieciowej. Gwarantuje unikalność, ale częściowo ujawnia, kiedy i na jakim urządzeniu powstał identyfikator.
  • v4 — całkowicie losowa (poza kilkoma bitami zarezerwowanymi na oznaczenie wersji). Najczęściej stosowany wariant dziś, właśnie dlatego, że nie ujawnia żadnych informacji ubocznych.
  • v5 — deterministyczna, obliczana jako skrót przestrzeni nazw i ciągu znaków — to samo wejście zawsze daje ten sam UUID.

Dlaczego prawdopodobieństwo kolizji jest praktycznie zerowe

W UUID v4 losowych jest 122 bity. Nawet generując miliardy UUID na sekundę przez stulecia, prawdopodobieństwo choćby jednej kolizji pozostaje astronomicznie małe — fakt matematycznie oparty na paradoksie urodzin dla przestrzeni tej wielkości.

Do czego to się przydaje

  • Generowanie kluczy głównych bazy danych bez centralnego licznika czy koordynacji między serwerami.
  • Tworzenie identyfikatorów sesji, żądań lub transakcji w systemach rozproszonych, bez rejestru centralnego jak w przypadku numeru PESEL.
  • Unikanie przewidywalnych, sekwencyjnych ID, które łatwo wyliczyć (w przeciwieństwie do 1, 2, 3...).

UUID v7: kompromis między losowością a sortowaniem

Całkowicie losowy UUID v4 źle wpływa na wydajność indeksów bazy danych — nowe rekordy są wstawiane w chaotyczne pozycje drzewa indeksu zamiast na koniec. Nowszy UUID v7 rozwiązuje ten problem, osadzając znacznik czasu w pierwszych bitach identyfikatora: wartości pozostają praktycznie unikalne, jak w v4, ale naturalnie sortują się według czasu utworzenia, jak sekwencyjny licznik.

Wypróbuj narzędzie