UUID v3 Generator

Generate deterministic name-based UUID v3 using MD5

Jmenný prostor

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

Název

Vygenerované UUID v3

Zadejte název a klikněte na Generovat
Stejný jmenný prostor + název vždy produkují stejné UUID
Note:UUID v3 je starší formát používající hashování MD5. Pro nový vývoj vyžadující deterministická UUID preferujte UUID v5 (SHA-1). Pro obecné jedinečné ID použijte UUID v4.

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ý prostorUUIDPoužít pro
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Plně kvalifikovaná doménová jména (např. 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL a URI (např. 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8ISO Identifikátory objektů (např. '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8X.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:

UUID v3
  • 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
UUID v5
  • 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:

Kanonizace URL
Vygenerujte deterministické UUID pro libovolnou URL pro použití jako kompaktní klíč s pevnou délkou v databázi nebo mezipaměti — bez ukládání mapovací tabulky.
Identifikátory na základě DNS
Přiřaďte stabilní UUID hostitelským jménům nebo doménovým jménům, která zůstávají konzistentní napříč nasazeními a databázemi.
Adresování obsahu
Vytvářejte reprodukovatelná ID pro obsahové položky identifikované jejich kanonickým názvem — články, produkty nebo konfigurační klíče.
Idempotentní vytváření zdrojů
Vygenerujte stejné UUID pro stejný název zdroje, takže opakované pokusy o vytvoření jsou přirozeně idempotentní bez vyhledávání.
Testovací přípravky
Produkujte stabilní, předvídatelná UUID v testovacích datech, takže testovací tvrzení nemusí být aktualizována při opětovném spuštění testů.
Deduplikace napříč systémy
Dva nezávislé systémy mohou odvodit stejné UUID pro stejný název bez komunikace, umožňující deduplikaci bez sdíleného registru ID.

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á:

Příklad (DNS jmenný prostor, název = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

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:

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

Časté dotazy

Jsou UUID v3 a UUID v5 zaměnitelné?
Ne — pro stejné vstupy produkují různé výstupy, protože používají různé hash funkce (MD5 vs SHA-1). UUID v3 a UUID v5 vygenerované ze stejného jmenného prostoru + názvu jsou různá UUID. Nejsou zaměnitelné, ale jsou funkčně ekvivalentní ve struktuře a případech použití.
Je UUID v3 odolné proti kolizím?
V rámci daného jmenného prostoru dva různé názvy vytvoří různé hodnoty UUID v3, pokud MD5 neprodukuje kolizi pro tyto specifické vstupy. Kolizní útoky MD5 existují, ale vyžadují pečlivě vytvořené vstupy — v praxi přirozeně se vyskytující názvy (URL, doménová jména, ID produktů) nebudou kolidovat. Pro vyšší jistotu použijte UUID v5.
Mohu použít UUID v3 jako primární klíč v databázi?
Ano, pokud rozumíte kompromisům. UUID v3 je deterministické, takže pro stejný název bude vygenerován stejný klíč — to poskytuje přirozenou idempotenci. UUID v3 však není seřaditelné podle pořadí generování a fragmentace indexu se uplatňuje stejně jako u UUID v4. Pro časově uspořádané, seřaditelné primární klíče použijte UUID v7.
Jaké kódování mám použít pro vstup názvu?
RFC 4122 specifikuje, že název by měl být převeden na bajty pomocí kanonické formy jmenného prostoru. Pro DNS jmenný prostor použijte doménové jméno jako řetězec UTF-8 bez koncové tečky. Pro URL jmenný prostor použijte plnou URL jako řetězec UTF-8. Vždy používejte stejné kódování konzistentně — různá kódování stejného logického názvu produkují různá UUID.
Skrývá UUID v3 původní název?
MD5 je jednosměrná funkce — nemůžete obrátit UUID v3, abyste získali původní název. Avšak pokud útočník zná jmenný prostor a podezřívá malou sadu možných názvů, může předpočítat hodnoty UUID v3 pro každého kandidáta a porovnat. Pro názvy z malého nebo předvídatelného prostoru UUID v3 neposkytuje žádnou důvěrnost. Použijte UUID v4, pokud potřebujete neprůhledný, neodhadnutelný identifikátor.