Имя - это не что иное, как идентификатор, уникальный в некотором пространстве имен. Проблема в том, что пространства имен часто довольно малы, и имена в одном часто конфликтуют с именами в других. Например, номерной знак (имя) моей машины уникален в пространстве имен DMV моего штата, но, вероятно, не является уникальным в мире; DMV других состояний могли использовать то же имя в своих пространствах имен. Черт возьми, у кого-то еще может быть номер телефона (имя), которое также совпадает, потому что это еще одно пространство имен и т. Д.
Можно рассматривать UUID как населяющие единое пространство имен, настолько обширное, что оно может предоставить уникальное имя для всего ; вот что означает «универсальный». Но как сопоставить существующие имена в других пространствах имен с UUID?
Одним из очевидных решений является создание UUID (V1 или V4) для каждого элемента, чтобы заменить старые имена в их непересекающихся пространствах имен. Обратной стороной является то, что они намного больше, вам нужно сообщить все новые имена всем, у кого есть копия вашего набора данных, обновить все ваши API и т. Д. Скорее всего, вы не можете полностью избавиться от старых имен. в любом случае, это означает, что теперь у каждого предмета есть два имени, так что вы сделали лучше или хуже?
Вот тут-то и пригодится V3 / V5. UUID выглядят так же случайно, как и V4, но на самом деле детерминированы; любой, у кого есть правильный UUID для пространства имен, может затем независимо сгенерировать тот же UUID для любого заданного имени в этом пространстве имен. Вам не нужно ни публиковать их, ни даже предварительно создавать, поскольку любой может создавать их на лету по мере необходимости!
DNS-имена и URL-адреса - очень часто используемые пространства имен, поэтому для них были опубликованы стандартные UUID; OID ASN.1 и имена X.500 встречаются не так часто, но органы по стандартизации любят их, поэтому они опубликовали стандартные UUID пространства имен.
Для всех других пространств имен вы должны создать свой собственный UUID пространства имен (V1 или V4) и передать его всем, кто в нем нуждается. Если у вас несколько пространств имен, публикация UUID для каждого из них явно не идеальна.
Здесь и появляется иерархия: вы создаете один «базовый» UUID (любого типа), а затем используете его как пространство имен для именования других пространств имен! Таким образом, вам нужно только опубликовать базовый UUID (или использовать очевидный), а все остальные смогут вычислить.
Например, давайте останемся, мы хотели создать несколько UUID для StackOverflow; который имеет очевидное имя в пространстве имен DNS, поэтому основа очевидна:
uuid ns_dns = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
uuid ns_base = uuidv5(ns_dns, 'stackoverflow.com');
Сам StackOverflow имеет отдельные пространства имен для пользователей, вопросов, ответов, комментариев и т.д., но они также довольно очевидны:
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');
Это конкретный вопрос # 10867405, поэтому его UUID будет:
uuid here = uuidv5(ns_question, '10867405');
Обратите внимание, что в этом процессе нет ничего случайного, поэтому любой, кто следует той же логике, получит тот же ответ, но пространство имен UUID настолько обширно, что оно (эффективно, учитывая безопасность 122-битного криптографического хеша) никогда не столкнется с UUID, сгенерированный из любой другой пары имя / пространство имен.