UUID v3 Generator
Generate deterministic name-based UUID v3 using MD5
Jmenný prostor
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Název
Vygenerované UUID v3
Co je UUID v3?
UUID v3 je verze UUID na základě názvu definovaná v RFC 4122. Místo náhodných dat nebo časového razítka odvozuje UUID deterministicky ze dvou vstupů: UUID jmenného prostoru a řetězce názvů. Pár jmenný prostor + název je hashován pomocí MD5 a výsledný hash je formátován jako UUID.
Klíčovou vlastností UUID v3 je determinismus: stejný jmenný prostor a název vždy vytvoří identické UUID, na jakémkoliv stroji, v jakémkoliv čase. To ho činí vhodným pro adresování obsahu — generování stabilních identifikátorů pro zdroje identifikované smysluplným názvem.
UUID v3 používá MD5 jako svou hash funkci. MD5 je považováno za kryptograficky prolomené pro bezpečnostní účely, proto je UUID v5 (které používá SHA-1) obecně preferováno pro nový vývoj. Ani v3 ani v5 neposkytují žádnou náhodnost — jsou čistě deterministické.
Standardní jmenné prostory
RFC 4122 definuje čtyři předem přiřazená UUID jmenných prostorů. Použití standardního jmenného prostoru zajišťuje interoperabilitu — dvě nezávislé implementace vytvoří stejné UUID v3 pro stejný název v rámci stejného jmenného prostoru:
| Jmenný prostor | UUID | Použít pro |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Plně kvalifikovaná doménová jména (např. 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL a URI (např. 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | ISO Identifikátory objektů (např. '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | X.500 Distinguished Names (např. 'cn=John,dc=example,dc=com') |
Jako vlastní jmenný prostor můžete také použít libovolné UUID — například UUID v4, které jednou vygenerujete a vložíte do aplikace jako konstantu. To vám umožní vytvořit soukromý jmenný prostor pro vlastní mapování název-na-UUID.
UUID v3 vs UUID v5
UUID v3 a UUID v5 jsou strukturálně identické — oba jsou deterministické, UUID na základě názvu. Jediný rozdíl je hash funkce:
- Používá hashování MD5
- 128bitový výstup (velikost UUID)
- Definováno v RFC 4122
- MD5 je kryptograficky prolomeno
- Podporováno všemi knihovnami UUID
- Používá hashování SHA-1
- 160bitový hash zkrácený na 128 bitů
- Definováno v RFC 4122
- SHA-1 je zastaralé pro bezpečnostní použití, ale silnější než MD5
- Podporováno všemi knihovnami UUID
Preferujte UUID v5 před UUID v3 pro veškerý nový vývoj. Hash SHA-1 je silnější než MD5 a výkonnostní rozdíl je zanedbatelný. Použijte UUID v3 pouze tehdy, když potřebujete reprodukovat UUID ze systému, který ho již používá.
Kdy použít UUID v3
UUID v3 (a v5) jsou vhodné, když potřebujete stabilní, reprodukovatelný identifikátor odvozený ze smysluplného názvu — spíše než náhodné ID, které musí být uloženo a vyhledáno:
Pochopení determinismu
Determinismus UUID v3 je zároveň jeho největší silou i nejdůležitějším omezením. Pro libovolné UUID jmenného prostoru a libovolný řetězec názvů je výstupní UUID zcela pevné — nezahrnuje žádnou náhodnost. To znamená:
Vždy vytvoří: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Pokud útočník zná jmenný prostor a může uhodnout název, může UUID předem vypočítat. Hodnoty UUID v3 by nikdy neměly být používány jako nepředvídatelné tokeny, ID relací nebo tajemství. Pro jakékoliv bezpečnostně citlivé identifikátory použijte UUID v4.
Příklady kódu
UUID v3 vyžaduje UUID jmenného prostoru a řetězec názvů. Použijte standardní balíček uuid:
// 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)
}