Napisałem generator / parser UUID dla Rubiego, więc uważam się za dość dobrze poinformowanego na ten temat. Istnieją cztery główne wersje UUID:
Identyfikatory UUID w wersji 4 to w zasadzie tylko 16 bajtów losowości pobieranych z kryptograficznie bezpiecznego generatora liczb losowych, z pewnymi zmianami bitów w celu zidentyfikowania wersji i wariantu UUID. Jest bardzo mało prawdopodobne, aby zderzyły się, ale może się zdarzyć, jeśli użyjesz PRNG lub jeśli po prostu masz naprawdę, naprawdę, naprawdę, naprawdę pecha.
Identyfikatory UUID wersji 5 i wersji 3 używają odpowiednio funkcji skrótu SHA1 i MD5 do łączenia przestrzeni nazw z fragmentem już unikalnych danych w celu wygenerowania identyfikatora UUID. Pozwoli to na przykład stworzyć UUID z adresu URL. Kolizje są tutaj możliwe tylko wtedy, gdy bazowa funkcja skrótu również ma kolizję.
Najpopularniejsze są identyfikatory UUID wersji 1. Używają adresu MAC karty sieciowej (który, o ile nie jest sfałszowany, powinien być unikalny), a także znacznika czasu i zwykłego manipulowania bitami w celu wygenerowania UUID. W przypadku maszyny, która nie ma adresu MAC, 6 bajtów węzłów jest generowanych za pomocą bezpiecznego kryptograficznie generatora liczb losowych. Jeśli dwa identyfikatory UUID są generowane sekwencyjnie na tyle szybko, że znacznik czasu pasuje do poprzedniego identyfikatora UUID, znacznik czasu jest zwiększany o 1. Kolizje nie powinny wystąpić, chyba że nastąpi jedno z poniższych: Adres MAC jest sfałszowany; Jedna maszyna z dwoma różnymi aplikacjami generującymi UUID generuje UUID dokładnie w tym samym momencie; Dwie maszyny bez karty sieciowej lub bez dostępu do adresu MAC na poziomie użytkownika otrzymują tę samą losową sekwencję węzłów i generują identyfikatory UUID dokładnie w tym samym momencie;
Realistycznie, żadne z tych zdarzeń nie występuje przypadkowo w przestrzeni identyfikatora pojedynczej aplikacji. O ile nie akceptujesz identyfikatorów w, powiedzmy, całym Internecie lub w niezaufanym środowisku, w którym złośliwe osoby mogą być w stanie zrobić coś złego w przypadku kolizji tożsamości, po prostu nie należy się tym martwić. Ważne jest, aby zrozumieć, że jeśli zdarzy ci się wygenerować ten sam identyfikator UUID w wersji 4 co ja, w większości przypadków nie ma to znaczenia. Wygenerowałem ID w zupełnie innej przestrzeni ID niż Twoja. Moja aplikacja nigdy nie dowie się o kolizji, więc kolizja nie ma znaczenia. Szczerze mówiąc, w pojedynczej przestrzeni aplikacji bez złośliwych aktorów wymieranie wszelkiego życia na Ziemi nastąpi na długo przed kolizją, nawet na UUID w wersji 4, nawet jeśli
Ponadto 2 ^ 64 * 16 to 256 eksabajtów. Tak jak w przypadku, należałoby przechowywać identyfikatory o wartości 256 eksabajtów, aby mieć 50% szans na kolizję identyfikatorów w pojedynczej przestrzeni aplikacji.