Nazwa to nic innego jak identyfikator, który jest unikalny w obrębie jakiejś przestrzeni nazw. Problem polega na tym, że przestrzenie nazw są często dość małe, a nazwy w jednej często kolidują z nazwami w innych. Na przykład numer rejestracyjny mojego samochodu (nazwa) jest unikalny w przestrzeni nazw DMV mojego stanu, ale prawdopodobnie nie jest unikalny na świecie; inne stanowe DMV mogły używać tej samej nazwy we własnych przestrzeniach nazw. Heck, ktoś inny może mieć numer telefonu (imię i nazwisko), który również pasuje, ponieważ jest to kolejna przestrzeń nazw itp.
Identyfikatory UUID można postrzegać jako zamieszkujące pojedynczą przestrzeń nazw tak rozległą, że może zapewnić unikalną nazwę dla wszystkiego ; to właśnie oznacza „uniwersalny”. Ale jak odwzorować istniejące nazwy w innych przestrzeniach nazw na identyfikator UUID?
Jednym z oczywistych rozwiązań jest wygenerowanie UUID (V1 lub V4) dla każdego elementu w celu zastąpienia starych nazw w ich rozłącznych przestrzeniach nazw. Wadą jest to, że są dużo większe, musisz przekazać wszystkie nowe nazwy każdemu, kto ma kopię twojego zbioru danych, zaktualizować wszystkie twoje API itp. Szanse są takie, że nie możesz całkowicie pozbyć się starych nazw w każdym razie, co oznacza, że teraz każdy przedmiot ma dwie nazwy, więc czy poprawiłeś sytuację?
Tutaj właśnie wkraczają V3 / V5. Identyfikatory UUID wyglądają tak samo losowo jak V4, ale w rzeczywistości są deterministyczne; każdy, kto ma odpowiedni identyfikator UUID dla przestrzeni nazw, może następnie niezależnie wygenerować ten sam identyfikator UUID dla dowolnej nazwy w tej przestrzeni nazw. Nie musisz ich w ogóle publikować ani nawet wstępnie generować, ponieważ każdy może je tworzyć w locie w razie potrzeby!
Nazwy DNS i adresy URL są bardzo często używanymi przestrzeniami nazw, dlatego opublikowano dla nich standardowe identyfikatory UUID; Nazwy ASN.1 OID i X.500 nie są tak powszechne, ale organizacje normalizacyjne je uwielbiają, więc opublikowały również dla nich standardowe identyfikatory UUID przestrzeni nazw.
W przypadku wszystkich innych przestrzeni nazw musisz wygenerować własny identyfikator UUID przestrzeni nazw (V1 lub V4) i przekazać go każdemu, kto tego potrzebuje. Jeśli masz kilka przestrzeni nazw, publikowanie identyfikatora UUID dla każdego z nich nie jest idealne.
Tutaj pojawia się hierarchia: tworzysz jeden „podstawowy” UUID (dowolnego typu), a następnie używasz go jako przestrzeni nazw do nazywania innych przestrzeni nazw! W ten sposób wystarczy opublikować podstawowy UUID (lub użyć oczywistego), a każdy może obliczyć resztę.
Na przykład, zostańmy, chcieliśmy stworzyć kilka UUID dla StackOverflow; który ma oczywistą nazwę w przestrzeni nazw DNS, więc podstawa jest oczywista:
uuid ns_dns = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
uuid ns_base = uuidv5(ns_dns, 'stackoverflow.com');
Sam StackOverflow ma osobne przestrzenie nazw dla użytkowników, pytań, odpowiedzi, komentarzy itp., Ale są one również dość oczywiste:
uuid ns_user = uuidv5(ns_base, 'user');
uuid ns_question = uuidv5(ns_base, 'question');
uuid ns_answer = uuidv5(ns_base, 'answer');
uuid ns_comment = uuidv5(ns_base, 'comment');
To konkretne pytanie to # 10867405, więc jego UUID będzie wyglądał następująco:
uuid here = uuidv5(ns_question, '10867405');
Zauważ, że w tym procesie nie ma nic losowego, więc każdy, kto postępuje zgodnie z tą samą logiką, otrzyma tę samą odpowiedź, ale przestrzeń nazw UUID jest tak rozległa, że (efektywnie, biorąc pod uwagę bezpieczeństwo 122-bitowego skrótu kryptograficznego) nigdy nie zderzy się z UUID wygenerowany z dowolnej innej pary przestrzeń nazw / nazwa.