UUID v3 Generator

Generate deterministic name-based UUID v3 using MD5

Простір імен

6ba7b810-9dad-11d1-80b4-00c04fd430c8

Ім'я

Згенерований UUID v3

Введіть ім'я і натисніть «Згенерувати»
Однакові простір імен + ім'я завжди дають однаковий UUID
Note:UUID v3 є детермінованим: однакові вхідні дані завжди дають однаковий UUID. Для відтворюваних ідентифікаторів з відомих вхідних даних — правильний вибір. Для випадкових ідентифікаторів загального призначення використовуйте UUID v4.

Що таке UUID v3?

UUID v3 — детермінована версія UUID, визначена в RFC 4122. UUID v3 генерується шляхом хешування простору імен і імені за допомогою MD5. Однакові простір імен + ім'я завжди дають однаковий UUID.

Детермінізм — і найсильніша сторона, і найбільше обмеження. UUID v3 не є непередбачуваним: знаючи простір імен і ім'я, UUID можна обчислити.

UUID v3 використовує MD5, який більше не вважається криптографічно захищеним. RFC 4122 рекомендує UUID v5 (SHA-1) для нових застосувань.

Зумовлені простори імен

RFC 4122 визначає чотири стандартних простори імен для v3 і v5:

Ім'яUUID простору іменВикористання
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Хешування доменних імен (наприклад, <code>example.com</code>)
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8Хешування URL (наприклад, <code>https://example.com/page</code>)
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8Хешування ідентифікаторів об'єктів ASN.1
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8Хешування розрізняльних імен X.500/LDAP

Можна використовувати будь-який UUID як користувацький простір імен, щоб ізолювати свої UUID від інших проектів.

UUID v3 проти UUID v5

Обидва детерміновані, відрізняються лише алгоритмом хешування:

UUID v3 (MD5)
  • Використовує хешування MD5
  • 128-бітний вихід (використовується 122 біти)
  • MD5 є криптографічно зламаним
  • Широко підтримується в застарілих системах
  • Використовуйте лише для зворотної сумісності
UUID v5 (SHA-1)
  • Використовує хешування SHA-1
  • 160-бітний вихід (використовується 122 біти)
  • SHA-1 є зламаним для колізій, але кращий за MD5
  • Рекомендований RFC 4122 замість v3
  • Використовуйте для нових реалізацій

Рекомендація: для нових реалізацій використовуйте UUID v5. UUID v3 — для зворотної сумісності.

Коли використовувати UUID v3

UUID v3 (і v5) доречні, коли потрібен відтворюваний детермінований ідентифікатор:

Стабільні ID для іменованих ресурсів
URL, DNS-імена або шляхи до файлів завжди відображаються на однаковий UUID v3.
Дедублювання даних
UUID із вмісту запису дозволяє виявити дублікати: однакові вхідні дані → однаковий UUID.
Зіставлення між системами
Записи з різних систем зіставляються одним алгоритмом без таблиці зіставлення.
Детерміновані тестові дані
Відтворювані тестові ID з відомих вхідних даних.
Ідентифікатори з адресацією за вмістом
Ідентифікація ресурсів за вмістом, а не за випадковими ID.
Відображення застарілих ID
Перетворення числових або рядкових ID застарілої системи в UUID без таблиці зіставлення.

Алгоритм детермінізму

Як генерується UUID v3:

Кроки алгоритму:9073926b-929f-31c2-abc9-fad77ae3e8eb

1. UUID простору імен → 16 байтів. 2. Об'єднати з байтами імені UTF-8. 3. Обчислити MD5 хеш. 4. Встановити версію 0011 (3) у байті 6. 5. Встановити варіант 10 у байті 8. 6. Представити як стандартний UUID.

Однакові вхідні дані → однаковий хеш → однаковий UUID. Без випадковості, без часової мітки.

Приклади коду

Усі основні UUID-бібліотеки підтримують v3:

JavaScript / Node.js
// Browser / Node.js — UUID v3 without dependencies
function uuidV3(namespace, name) {
  // namespace must be a UUID string like '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
  const nsBytes = namespace.replace(/-/g, '').match(/../g).map(h => parseInt(h, 16))
  const nameBytes = [...new TextEncoder().encode(name)]
  const combined = new Uint8Array([...nsBytes, ...nameBytes])

  // md5(combined) — use your preferred MD5 library or the inline implementation
  const hash = md5(combined) // returns Uint8Array(16)
  hash[6] = (hash[6] & 0x0f) | 0x30 // version 3
  hash[8] = (hash[8] & 0x3f) | 0x80 // variant

  const h = [...hash].map(b => b.toString(16).padStart(2, '0')).join('')
  return `${h.slice(0,8)}-${h.slice(8,12)}-${h.slice(12,16)}-${h.slice(16,20)}-${h.slice(20)}`
}

// Using the 'uuid' npm package
import { v3 as uuidv3 } from 'uuid'
const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'
console.log(uuidv3('example.com', uuidv3.DNS))
// → '9073926b-929f-31c2-abc9-fad77ae3e8eb' (always the same)
Python
import uuid

# Using the standard library
dns_uuid = uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com')
print(dns_uuid)
# → 9073926b-929f-31c2-abc9-fad77ae3e8eb

url_uuid = uuid.uuid3(uuid.NAMESPACE_URL, 'https://example.com/page')
print(url_uuid)

# Custom namespace
MY_NS = uuid.UUID('a1b2c3d4-e5f6-7890-abcd-ef1234567890')
custom = uuid.uuid3(MY_NS, 'my-entity-name')
print(custom)
Go
package main

import (
    "fmt"
    "github.com/google/uuid"
)

func main() {
    // Standard DNS namespace
    ns := uuid.MustParse("6ba7b810-9dad-11d1-80b4-00c04fd430c8")
    id := uuid.NewMD5(ns, []byte("example.com"))
    fmt.Println(id)
    // → 9073926b-929f-31c2-abc9-fad77ae3e8eb

    // URL namespace
    urlNS := uuid.MustParse("6ba7b811-9dad-11d1-80b4-00c04fd430c8")
    idURL := uuid.NewMD5(urlNS, []byte("https://example.com/page"))
    fmt.Println(idURL)
}

Часті запитання

Якщо знову запустити UUID v3 з тими самими вхідними даними, отримаю той самий UUID?
Так, завжди. Однакові простір імен + ім'я → однаковий UUID, на будь-якій машині та мові.
Чи може хтось зворотньо обчислити UUID v3, щоб отримати початкове ім'я?
MD5 — одностороння функція. Пряме зворотне обчислення неможливе. Однак передбачувані вхідні дані можна визначити перебором.
Чи можна використовувати користувацькі простори імен?
Так. Будь-який дійсний UUID може бути простором імен. Поширена практика — UUID v4 проекту як простір імен.
Чи є UUID v3 детермінованими між різними мовами програмування?
Так, при дотриманні специфікації: MD5(байти простору імен + байти імені UTF-8) з встановленням бітів версії та варіанта.
Що відбувається, якщо два різних імені дають однаковий UUID v3?
Це колізія хешу. MD5 теоретично вразливий. Для критичних випадків використовуйте UUID v5.