UUID v3 Generator

Generate deterministic name-based UUID v3 using MD5

Namnrymd

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

Namn

Genererad UUID v3

Ange ett namn och klicka på Generera
Samma namnrymd + namn ger alltid samma UUID
Note:UUID v3 är ett äldre format som använder MD5-hashning. För ny utveckling som kräver deterministiska UUID:n, föredra UUID v5 (SHA-1). För allmänna unika ID:n, använd UUID v4.

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:

NamnrymdUUIDAnvänds för
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Fullt kvalificerade domännamn (t.ex. 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL:er och URI:er (t.ex. 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8ISO-objektidentifierare (t.ex. '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8X.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:

UUID v3
  • Använder MD5-hashning
  • 128-bitars utdata (UUID-storlek)
  • Definierad i RFC 4122
  • MD5 är kryptografiskt bruten
  • Stöds av alla UUID-bibliotek
UUID v5
  • 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:

URL-kanonisering
Generera ett deterministiskt UUID för valfri URL att använda som en kompakt, fast längd-nyckel i en databas eller cache — utan att lagra en mappningstabell.
DNS-baserade identifierare
Tilldela stabila UUID:n till värdnamn eller domännamn som förblir konsekventa över driftsättningar och databaser.
Innehållsadressering
Skapa reproducerbara ID:n för innehållsobjekt identifierade av deras kanoniska namn — artiklar, produkter eller konfigurationsnycklar.
Idempotent resursskapande
Generera samma UUID för samma resursnamn, så att upprepade skapandeförsök naturligt är idempotenta utan en sökning.
Testfixtur
Producera stabila, förutsägbara UUID:n i testdata så att testpåståenden inte behöver uppdateras när tester körs om.
Tvärsystemsdeduplicering
Två oberoende system kan härleda samma UUID för samma namn utan kommunikation, vilket möjliggör deduplicering utan ett delat ID-register.

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:

Exempel (DNS-namnrymd, namn = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

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:

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

Vanliga frågor

Är UUID v3 och UUID v5 utbytbara?
Nej — de ger olika utdata för samma indata eftersom de använder olika hashfunktioner (MD5 vs SHA-1). Ett UUID v3 och ett UUID v5 genererade från samma namnrymd + namn är olika UUID:n. De är inte utbytbara, men de är funktionellt ekvivalenta i struktur och användningsfall.
Är UUID v3 kollisionsresistent?
Inom en given namnrymd ger två olika namn olika UUID v3-värden så länge MD5 inte producerar en kollision för dessa specifika indata. MD5-kollisionsattacker finns, men de kräver noggrant utformade indata — i praktiken kolliderar naturligt förekommande namn (URL:er, domännamn, produkt-ID:n) inte. För högre säkerhet, använd UUID v5.
Kan jag använda UUID v3 som en primärnyckel i en databas?
Ja, om du förstår avvägningarna. UUID v3 är deterministisk, så samma nyckel genereras för samma namn — detta ger naturlig idempotens. UUID v3 är dock inte sorterbar efter genereringsordning, och indexfragmentering gäller precis som med UUID v4. För tidsordnade, sorterbara primärnycklar, använd UUID v7.
Vilken kodning ska jag använda för namnindatan?
RFC 4122 specificerar att namnet ska konverteras till byte med den kanoniska formen av namnrymden. För DNS-namnrymden, använd domännamnet som en UTF-8-sträng utan avslutande punkt. För URL-namnrymden, använd den fullständiga URL:en som en UTF-8-sträng. Använd alltid samma kodning konsekvent — olika kodningar av samma logiska namn ger olika UUID:n.
Döljer UUID v3 det ursprungliga namnet?
MD5 är en envägsfunktion — du kan inte reversera ett UUID v3 för att återfå det ursprungliga namnet. Men om en angripare känner till namnrymden och misstänker en liten uppsättning möjliga namn kan de förberäkna UUID v3-värden för varje kandidat och jämföra. För namn från ett litet eller förutsägbart utrymme ger UUID v3 ingen konfidentialitet. Använd UUID v4 om du behöver en ogenomskinlig, icke-gissningsbar identifierare.