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)
}