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.
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.
Odpowiedzi:
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.
reproducible
identyfikator 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.
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)
set_size
wynosi 2 ^ 122, co jest bardzo duże .
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.
NAMESPACE_URL
to UUID zwykle równy 6ba7b811-9dad-11d1-80b4-00c04fd430c8
, zgodnie z zaleceniami podanymi na stronie 30 RFC-4122 .
Dokumentacja Postgres opisuje różnice między UUID
s. 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.