Ім'я - це не що інше, як ідентифікатор, унікальний у певній області імен. Проблема полягає в тому, що простори імен часто досить малі, а імена в одних часто стикаються з іменами в інших. Наприклад, номер (найменування) мого автомобіля є унікальним у просторі імен мого штату DMV, але він, мабуть, не є унікальним у світі; інші державні DMV можуть використовувати те саме ім’я у власних просторах імен. Хрен, у когось іншого може бути номер телефону (ім'я), який також відповідає тому, що це ще одне простір імен тощо.
UUID можна розглядати як такі, що займають єдиний простір імен настільки величезний, що він може надати унікальну назву для всього ; ось що означає "універсальний". Але як відобразити наявні імена в інших просторах імен на UUID?
Одне очевидне рішення - створити UUID (V1 або V4) для кожного елемента, щоб замінити старі імена в їхніх неперервних просторах імен. Мінус полягає в тому, що вони набагато більше, ви повинні повідомити всі нові імена всім, хто має копію вашого набору даних, оновити всі свої API та ін. Швидше за все, ви насправді не зможете повністю позбутися старих імен. у будь-якому випадку, це означає, що зараз кожен предмет має два назви, тож ви зробили щось краще чи гірше?
Тут входять V3 / V5. UUID виглядають так само випадково, як V4, але насправді детерміновані; кожен, хто має право UUID для простору імен, може самостійно генерувати той самий UUID для будь-якого даного імені в цьому просторі імен. Вам взагалі не потрібно публікувати їх, а також попередньо створювати їх, оскільки кожен може створювати їх на ходу за потребою!
Імена та URL-адреси DNS дуже часто використовуються просторами імен, тому для них були опубліковані стандартні UUID; ASN.1 імена OID та 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, створений з будь-якого іншого простору імен / пари імен.