Jakiej wersji UUID użyć?


332

Której wersji UUID należy użyć? Widziałem wiele wątków wyjaśniających, co pociąga za sobą każda wersja, ale mam problem z ustaleniem, co jest najlepsze dla jakich aplikacji.


2
Jakie są twoje wybory?
Gabe,

Wszystko, co działa z pythonem. Więc chyba ten docs.python.org/2/library/uuid.html . 1,3,4,5.
user1802143

Jeśli jesteś ciekawy wersji 3 i 5, zobacz to pytanie, Generowanie UUID v5. Co to jest nazwa i przestrzeń nazw? .
Basil Bourque,

Odpowiedzi:


414

Istnieją dwa różne sposoby generowania UUID.

Jeśli potrzebujesz tylko unikalnego identyfikatora, potrzebujesz wersji 1 lub 4.

  • Wersja 1: Generuje unikalny identyfikator na podstawie adresu MAC karty sieciowej i timera. Te identyfikatory są łatwe do przewidzenia (biorąc pod uwagę jeden, być może uda mi się odgadnąć inny) i można je prześledzić na karcie sieciowej. Nie zaleca się ich tworzenia.

  • Wersja 4: Są one generowane z liczb losowych (lub pseudolosowych). Jeśli potrzebujesz tylko wygenerować identyfikator UUID, prawdopodobnie tego właśnie potrzebujesz.

Jeśli musisz zawsze generować ten sam UUID na podstawie podanej nazwy, potrzebujesz wersji 3 lub 5.

  • Wersja 3: Generuje unikalny identyfikator z skrótu MD5 przestrzeni nazw i nazwy. Jeśli potrzebujesz kompatybilności wstecznej (z innym systemem, który generuje UUID na podstawie nazw), użyj tego.

  • Wersja 5: Generuje unikalny identyfikator z skrótu SHA-1 przestrzeni nazw i nazwy. To jest preferowana wersja.


17
Dodałbym: jeśli chcesz wygenerować reproducibleidentyfikator UUID na podstawie podanej nazwy, potrzebujesz wersji 3 lub wersji 5. Jeśli podasz temu algorytmowi to samo wejście, wygeneruje to samo wyjście.
anregen

3
W środowisku przetwarzania w chmurze (takim jak AWS lub GAE) wydaje się, że słabość wersji 1 zostaje zredukowana do zapomnienia. Tam gdzie z czasem do generatora UUID aplikacji zostaną zastosowane tysiące różnych adresów MAC, eliminując przewidywalność i / lub identyfikowalność.
Buffalo Rabor,

3
@ user239558 Biorąc pod uwagę, że celem UUID jest jego unikalność, UUIDv5 nadal może być preferowany.
Epikurysta

7
Ten komentarz o „niezalecaniu” wersji 1 jest zbyt uproszczony. W wielu sytuacjach są one rzeczywiście w porządku i są lepsze. Ale jeśli masz obawy dotyczące bezpieczeństwa związane z wyciekiem któregokolwiek z tych informacji z identyfikatora UUID, które mogą zostać udostępnione niewiarygodnym podmiotom: (a) adres MAC maszyny tworzącej UUID lub (b) datę utworzenia, następnie unikaj wersji 1. Jeśli te dwie informacje nie są wrażliwe, to wersja 1 jest świetną drogą do przejścia.
Basil Bourque,

9
Co się stało z wersją 2?
Matthew Woo

53

Jeśli chcesz liczbę losową, użyj biblioteki liczb losowych. Jeśli chcesz unikalnego identyfikatora z efektywnie 0,00 ... o wiele więcej zer tutaj ... 001% szansy na kolizję, powinieneś użyć UUIDv1. Zobacz post Nicka dla UUIDv3 i v5.

UUIDv1 NIE jest bezpieczny. Tak nie jest. Ma być UNIKALNY, a nie zgadywalny. UUIDv1 używa aktualnego znacznika czasu oraz identyfikatora komputera, a także niektórych losowych elementów, aby utworzyć liczbę, która nigdy nie będzie generowana przez ten algorytm. Jest to odpowiednie dla identyfikatora transakcji (nawet jeśli wszyscy robią miliony transakcji / s).

Szczerze mówiąc, nie rozumiem, dlaczego UUIDv4 istnieje ... po odczytaniu RFC4122 wygląda na to, że ta wersja NIE eliminuje możliwości kolizji. To tylko generator liczb losowych. Jeśli to prawda, masz bardzo DOBRE szanse, że dwie maszyny na świecie ostatecznie utworzą ten sam „UUID” v4 (cytuje, ponieważ nie ma mechanizmu gwarantującego U.niversal U.niqueness). W tej sytuacji nie sądzę, że algorytm należy do RFC opisującego metody generowania unikalnych wartości. Byłoby to częścią RFC o generowaniu losowości. Dla zestawu liczb losowych:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

67
Nie zobaczysz kolizji dwóch implementacji UUID w wersji 4, chyba że wygenerujesz miliard UUID co sekundę przez sto lat i nie wygrasz rzutu monetą . Pamiętaj, że set_sizewynosi 2 ^ 122, co jest bardzo duże .
Kevin,

8
Algorytm V4 nie jest szeregowy, co oznacza, że ​​istnieje prawdopodobieństwo, że dwa pierwsze UUID wygenerowane przez v4 mogą się zgadzać. To, że istnieje wiele opcji, nie oznacza, że ​​musisz skończyć z unikalnymi opcjami, zanim wygenerujesz powtórzenie. To może się zdarzyć w dowolnym momencie.
anregen,

7
W rzeczywistości nie wykonujesz matematyki. My (jako gatunek) nie generujemy 1 miliarda UUID co sekundę. Więc mamy już ponad 100 lat, aż do pierwszej kolizji (średnio).
Kevin,

31
V4 „może” kolidować, ale prawdopodobieństwo jest wyjątkowo niskie, że dla większości przypadków użycia jest warte ryzyka. Re: „dwie maszyny na świecie ostatecznie tworzą ten sam„ UUID ”v4, oczywiście, ale to nie jest problem, ponieważ większość komputerów na świecie, które używają UUID, używają ich w różnych kontekstach. Mam na myśli, że jeśli wygeneruję ten sam UUID dla mojej wewnętrznej aplikacji, co ty dla swojej wewnętrznej aplikacji, to nie ma to znaczenia. Zderzenia mają znaczenie tylko wtedy, gdy mają miejsce w tym samym kontekście. (pamiętaj, że nawet w obrębie aplikacji wiele identyfikatorów UUID nie musi być unikatowych w całej aplikacji, tylko w kontekście, w jakim są używane)

6
Brzmi więc to tak, jakbyś nie potrzebował swojego Guida do zabezpieczenia, użyj wersji 1. Jeśli potrzebujesz go bezpiecznie i czujesz się szczęśliwy (lub naprawdę nie czujesz się nieszczęśliwie), użyj wersji 4.
Vaccano

16

To bardzo ogólne pytanie. Jedna odpowiedź brzmi: „zależy od tego, jaki UUID chcesz wygenerować”. Ale lepsze jest to: „Cóż, zanim odpowiem, czy możesz nam powiedzieć, dlaczego musisz zakodować własny algorytm generowania UUID zamiast wywoływać funkcje generowania UUID, które zapewnia większość współczesnych systemów operacyjnych?”

Jest to łatwiejsze i bezpieczniejsze, a ponieważ prawdopodobnie nie musisz generować własnego, po co zawracać sobie głowę kodowaniem implementacji? W takim przypadku odpowiedź staje się użyta bez względu na system operacyjny, język programowania lub platformę. Na przykład w systemie Windows istnieje CoCreateGuid lub UuidCreate lub jedno z różnych opakowań dostępnych z wielu używanych ram. W Linuksie jest uuid_generate .

Jeśli z jakiegoś powodu absolutnie potrzebujesz wygenerować własny, to przynajmniej masz rozsądek, aby trzymać się z dala od generowania UUID v1 i v2. Trudno jest to naprawić. Zamiast tego trzymaj się UUID v3, v4 lub v5.

Aktualizacja : W komentarzu wspominasz, że używasz Pythona i link do tego . Przeglądając dostarczony interfejs, najłatwiejszą opcją byłoby wygenerowanie identyfikatora UUID v4 (to znaczy utworzonego z losowych danych) przez wywołanie uuid.uuid4().

Jeśli masz jakieś dane, które potrzebujesz (lub potrafisz) mieszać, aby wygenerować UUID, możesz użyć v3 (która opiera się na MD5) lub v5 (która opiera się na SHA1). Generowanie identyfikatora UUID v3 lub v5 jest proste: najpierw wybierz typ UUID, który chcesz wygenerować (prawdopodobnie powinieneś wybrać v5), a następnie wybierz odpowiednią przestrzeń nazw i wywołaj funkcję z danymi, z których chcesz wygenerować UUID. Na przykład, jeśli masz hashujący adres URL, którego byś użył NAMESPACE_URL:

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

Pamiętaj, że ten UUID będzie inny niż UUID v5 dla tego samego adresu URL, który jest generowany w następujący sposób:

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

Przyjemną właściwością adresów URL v3 i v5 jest to, że powinny one być interoperacyjne między implementacjami. Innymi słowy, jeśli dwa różne systemy używają implementacji zgodnej z RFC4122, oba (lub przynajmniej powinny ) wygenerują ten sam UUID, jeśli wszystkie inne rzeczy są równe (tj. Generują tę samą wersję UUID, z tą samą przestrzenią nazw i te same dane). Ta właściwość może być bardzo pomocna w niektórych sytuacjach (szczególnie w scenariuszach przechowywania adresowalnych treścią), ale być może nie w twoim konkretnym przypadku.


4
Sądzę, że dzieje się tak, ponieważ OP nie zapytał: w jaki sposób „zakodować [mój] własny algorytm generowania UUID zamiast wywoływać funkcje generowania UUID, które zapewnia większość współczesnych systemów operacyjnych?”
anregen

Poza tym myślę, że to dobre wytłumaczenie UUIDv3 i v5. Zobacz moją odpowiedź poniżej, dlaczego uważam, że v1 może być dobrym wyborem.
anregen

co to jest NAMESPACE_URL? to zmienna, którą mogę uzyskać? Skąd?
stackdave

@stackdave NAMESPACE_URLto UUID zwykle równy 6ba7b811-9dad-11d1-80b4-00c04fd430c8, zgodnie z zaleceniami podanymi na stronie 30 RFC-4122 .
Jamie Ridding

2

Dokumentacja Postgres opisuje różnice między UUIDs. Kilka z nich:

V3:

uuid_generate_v3(namespace uuid, name text) - Ta funkcja generuje identyfikator UUID wersji 3 w podanej przestrzeni nazw przy użyciu określonej nazwy wejściowej.

V4:

uuid_generate_v4 - Ta funkcja generuje UUID w wersji 4, który w całości pochodzi z liczb losowych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.