UUID v3 Generator
Generate deterministic name-based UUID v3 using MD5
Namnrymd
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Namn
Genererad UUID v3
Vad är UUID v3?
UUID v3 är en namnbaserad UUID-version definierad i RFC 4122. Istället för slumpmässiga data eller en tidsstämpel härleder den UUID:t deterministiskt från två indata: ett namnrymds-UUID och en namnsträng. Namnrymden + namnparet hashas med MD5, och den resulterande hashen formateras som ett UUID.
Nyckelegenskapen hos UUID v3 är determinism: samma namnrymd och namn ger alltid det identiska UUID:t, på vilken maskin som helst, vid vilken tid som helst. Det gör det lämpligt för innehållsadressering — att generera stabila identifierare för resurser som identifieras av ett meningsfullt namn.
UUID v3 använder MD5 som sin hashfunktion. MD5 anses kryptografiskt bruten för säkerhetsändamål, varför UUID v5 (som använder SHA-1) generellt föredras för ny utveckling. Varken v3 eller v5 ger någon slumpmässighet — de är rent deterministiska.
Standardnamnrymder
RFC 4122 definierar fyra förtilldelade namnrymds-UUID:n. Att använda en standardnamnrymd säkerställer interoperabilitet — två oberoende implementationer ger samma UUID v3 för samma namn inom samma namnrymd:
| Namnrymd | UUID | Används för |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Fullt kvalificerade domännamn (t.ex. 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL:er och URI:er (t.ex. 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | ISO-objektidentifierare (t.ex. '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | X.500 Distinguished Names (t.ex. 'cn=John,dc=example,dc=com') |
Du kan också använda vilket godtyckligt UUID som helst som en anpassad namnrymd — till exempel ett UUID v4 som du genererar en gång och bäddar in i din applikation som en konstant. Det låter dig skapa ett privat namnområde för dina egna namn-till-UUID-mappningar.
UUID v3 vs UUID v5
UUID v3 och UUID v5 är strukturellt identiska — båda är deterministiska, namnbaserade UUID:n. Den enda skillnaden är hashfunktionen:
- Använder MD5-hashning
- 128-bitars utdata (UUID-storlek)
- Definierad i RFC 4122
- MD5 är kryptografiskt bruten
- Stöds av alla UUID-bibliotek
- Använder SHA-1-hashning
- 160-bitars hash trunkerad till 128 bitar
- Definierad i RFC 4122
- SHA-1 är utfasad för säkerhetsanvändning men starkare än MD5
- Stöds av alla UUID-bibliotek
Föredra UUID v5 framför UUID v3 för all ny utveckling. SHA-1-hashen är starkare än MD5, och prestandaskillnaden är försumbar. Använd UUID v3 bara när du behöver reproducera UUID:n från ett system som redan använder det.
När man ska använda UUID v3
UUID v3 (och v5) är lämpliga när du behöver en stabil, reproducerbar identifierare härledd från ett meningsfullt namn — snarare än ett slumpmässigt ID som måste lagras och slås upp:
Förstå determinism
Determinismen hos UUID v3 är både dess största styrka och dess viktigaste begränsning. Given valfritt namnrymds-UUID och valfri namnsträng är utdata-UUID:t helt fast — ingen slumpmässighet är inblandad. Det innebär:
Ger alltid: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Om en angripare känner till namnrymden och kan gissa namnet kan de beräkna UUID:t i förväg. UUID v3-värden bör aldrig användas som oförutsägbara tokens, sessions-ID:n eller hemligheter. Använd UUID v4 för alla säkerhetskänsliga identifierare.
Kodexempel
UUID v3 kräver ett namnrymds-UUID och en namnsträng. Använd standardpaketet 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)
}