UUID v3 Generator
Generate deterministic name-based UUID v3 using MD5
Простір імен
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Ім'я
Згенерований UUID v3
Що таке 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 простору імен | Використання |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Хешування доменних імен (наприклад, <code>example.com</code>) |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | Хешування URL (наприклад, <code>https://example.com/page</code>) |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | Хешування ідентифікаторів об'єктів ASN.1 |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | Хешування розрізняльних імен X.500/LDAP |
Можна використовувати будь-який UUID як користувацький простір імен, щоб ізолювати свої UUID від інших проектів.
UUID v3 проти UUID v5
Обидва детерміновані, відрізняються лише алгоритмом хешування:
- Використовує хешування MD5
- 128-бітний вихід (використовується 122 біти)
- MD5 є криптографічно зламаним
- Широко підтримується в застарілих системах
- Використовуйте лише для зворотної сумісності
- Використовує хешування SHA-1
- 160-бітний вихід (використовується 122 біти)
- SHA-1 є зламаним для колізій, але кращий за MD5
- Рекомендований RFC 4122 замість v3
- Використовуйте для нових реалізацій
Рекомендація: для нових реалізацій використовуйте UUID v5. UUID v3 — для зворотної сумісності.
Коли використовувати UUID v3
UUID v3 (і v5) доречні, коли потрібен відтворюваний детермінований ідентифікатор:
Алгоритм детермінізму
Як генерується UUID v3:
1. UUID простору імен → 16 байтів.
2. Об'єднати з байтами імені UTF-8.
3. Обчислити MD5 хеш.
4. Встановити версію 0011 (3) у байті 6.
5. Встановити варіант 10 у байті 8.
6. Представити як стандартний UUID.
Однакові вхідні дані → однаковий хеш → однаковий UUID. Без випадковості, без часової мітки.
Приклади коду
Усі основні UUID-бібліотеки підтримують v3:
// 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)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)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)
}