Generator UUID v3

Generuje deterministyczne UUID v3 oparte na nazwie przy użyciu MD5

Przestrzeń nazw

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

Nazwa

Wygenerowany UUID v3

Wprowadź nazwę i kliknij Generuj
Taka sama przestrzeń nazw + nazwa zawsze dają ten sam UUID
Note:UUID v3 to format dziedziczny używający skrótu MD5. Do nowego rozwoju wymagającego deterministycznych UUID preferuj UUID v5 (SHA-1). W przypadku ogólnych unikalnych identyfikatorów użyj UUID v4.

Czym jest UUID v3?

UUID v3 to wersja UUID oparta na nazwach zdefiniowana w RFC 4122. Zamiast losowych danych lub znacznika czasu, wyprowadza UUID deterministycznie z dwóch danych wejściowych: UUID przestrzeni nazw i ciągu nazwy. Para przestrzeń nazw + nazwa jest hashowana przy użyciu MD5, a wynikowy skrót jest formatowany jako UUID.

Kluczową właściwością UUID v3 jest determinizm: ta sama przestrzeń nazw i nazwa zawsze wyprodukuje identyczny UUID, na dowolnej maszynie, w dowolnym czasie. To czyni go odpowiednim do adresowania treści — generowania stabilnych identyfikatorów dla zasobów identyfikowanych przez znaczącą nazwę.

UUID v3 używa MD5 jako funkcji skrótu. MD5 jest uważany za kryptograficznie zepsuty dla celów bezpieczeństwa, dlatego UUID v5 (który używa SHA-1) jest generalnie preferowany dla nowego rozwoju. Ani v3, ani v5 nie zapewnia żadnej losowości — są czysto deterministyczne.

Standardowe przestrzenie nazw

RFC 4122 definiuje cztery wstępnie przypisane UUID przestrzeni nazw. Używanie standardowej przestrzeni nazw zapewnia interoperacyjność — dwie niezależne implementacje wyprodukują ten sam UUID v3 dla tej samej nazwy w tej samej przestrzeni nazw:

Przestrzeń nazwUUIDUżyj dla
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8W pełni kwalifikowane nazwy domen (np. 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL-e i URI (np. 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8Identyfikatory obiektów ISO (np. '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8Wyróżnione nazwy X.500 (np. 'cn=John,dc=example,dc=com')

Możesz również użyć dowolnego UUID jako niestandardowej przestrzeni nazw — na przykład UUID v4, który generujesz raz i osadzasz w swojej aplikacji jako stałą. Pozwala to tworzyć prywatną przestrzeń nazw dla własnych mapowań nazwa-do-UUID.

UUID v3 a UUID v5

UUID v3 i UUID v5 są strukturalnie identyczne — oba są deterministycznymi, opartymi na nazwach UUID. Jedyna różnica to funkcja skrótu:

UUID v3
  • Używa skrótu MD5
  • 128-bitowe wyjście (rozmiar UUID)
  • Zdefiniowany w RFC 4122
  • MD5 jest kryptograficznie zepsuty
  • Obsługiwany przez wszystkie biblioteki UUID
UUID v5
  • Używa skrótu SHA-1
  • 160-bitowy skrót skrócony do 128 bitów
  • Zdefiniowany w RFC 4122
  • SHA-1 jest przestarzały do zastosowań bezpieczeństwa, ale silniejszy niż MD5
  • Obsługiwany przez wszystkie biblioteki UUID

Preferuj UUID v5 nad UUID v3 dla całego nowego rozwoju. Skrót SHA-1 jest silniejszy niż MD5, a różnica wydajności jest pomijalnie mała. Używaj UUID v3 tylko wtedy, gdy musisz odtworzyć UUID z systemu, który już go używa.

Kiedy używać UUID v3

UUID v3 (i v5) są odpowiednie, gdy potrzebujesz stabilnego, odtwarzalnego identyfikatora wywodzącego się ze znaczącej nazwy — zamiast losowego identyfikatora, który musi być przechowywany i wyszukiwany:

Kanonizacja URL
Generuj deterministyczny UUID dla dowolnego URL, aby używać go jako kompaktowego klucza o stałej długości w bazie danych lub pamięci podręcznej — bez przechowywania tabeli mapowań.
Identyfikatory oparte na DNS
Przypisuj stabilne UUID do nazw hostów lub nazw domen, które pozostają spójne między wdrożeniami i bazami danych.
Adresowanie treści
Twórz odtwarzalne identyfikatory dla elementów treści identyfikowanych przez ich kanoniczną nazwę — artykuły, produkty lub klucze konfiguracyjne.
Idempotentne tworzenie zasobów
Generuj ten sam UUID dla tej samej nazwy zasobu, aby wielokrotne próby tworzenia były naturalnie idempotentne bez wyszukiwania.
Dane testowe
Produkuj stabilne, przewidywalne UUID w danych testowych, aby potwierdzenia testów nie wymagały aktualizacji przy ponownym uruchamianiu testów.
Deduplikacja między systemami
Dwa niezależne systemy mogą wyprowadzić ten sam UUID dla tej samej nazwy bez komunikacji, umożliwiając deduplikację bez wspólnego rejestru identyfikatorów.

Zrozumienie determinizmu

Determinizm UUID v3 jest zarówno jego największą siłą, jak i najważniejszym ograniczeniem. Dla dowolnego UUID przestrzeni nazw i dowolnego ciągu nazwy wyjściowy UUID jest całkowicie stały — nie jest zaangażowana żadna losowość. Oznacza to:

Przykład (przestrzeń nazw DNS, nazwa = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

Zawsze produkuje: 9073926b-929f-31c2-abc9-fad77ae3e8eb

Jeśli atakujący zna przestrzeń nazw i może odgadnąć nazwę, może z góry obliczyć UUID. Wartości UUID v3 nigdy nie powinny być używane jako nieprzewidywalne tokeny, identyfikatory sesji ani sekrety. Użyj UUID v4 dla każdego identyfikatora wrażliwego na bezpieczeństwo.

Przykłady kodu

UUID v3 wymaga UUID przestrzeni nazw i ciągu nazwy. Użyj standardowego pakietu 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)
}

Często zadawane pytania

Czy UUID v3 i UUID v5 są wymienne?
Nie — produkują różne wyjścia dla tych samych danych wejściowych, ponieważ używają różnych funkcji skrótu (MD5 vs SHA-1). UUID v3 i UUID v5 wygenerowane z tej samej przestrzeni nazw + nazwy będą różnymi UUID. Nie są wymienne, ale są funkcjonalnie równoważne pod względem struktury i przypadków użycia.
Czy UUID v3 jest odporny na kolizje?
W danej przestrzeni nazw dwie różne nazwy wyprodukują różne wartości UUID v3, o ile MD5 nie produkuje kolizji dla tych konkretnych danych wejściowych. Ataki kolizyjne MD5 istnieją, ale wymagają starannie spreparowanych danych wejściowych — w praktyce naturalnie występujące nazwy (URL-e, nazwy domen, identyfikatory produktów) nie będą kolidować. Dla wyższego zapewnienia użyj UUID v5.
Czy mogę użyć UUID v3 jako klucza głównego w bazie danych?
Tak, jeśli rozumiesz kompromisy. UUID v3 jest deterministyczny, więc ten sam klucz zostanie wygenerowany dla tej samej nazwy — zapewnia to naturalną idempotentność. Jednak UUID v3 nie jest sortowalny według kolejności generowania, a fragmentacja indeksu dotyczy go tak samo jak UUID v4. Dla posortowanych według czasu kluczy głównych użyj UUID v7.
Jakiego kodowania powinienem użyć dla danych wejściowych nazwy?
RFC 4122 określa, że nazwa powinna być konwertowana na bajty przy użyciu kanonicznej formy przestrzeni nazw. Dla przestrzeni nazw DNS użyj nazwy domeny jako ciągu UTF-8 bez końcowej kropki. Dla przestrzeni nazw URL użyj pełnego URL jako ciągu UTF-8. Zawsze używaj tego samego kodowania konsekwentnie — różne kodowania tej samej logicznej nazwy wyprodukują różne UUID.
Czy UUID v3 ukrywa oryginalną nazwę?
MD5 to funkcja jednokierunkowa — nie można odwrócić UUID v3, aby odzyskać oryginalną nazwę. Jednak jeśli atakujący zna przestrzeń nazw i podejrzewa mały zestaw możliwych nazw, może z góry obliczyć wartości UUID v3 dla każdego kandydata i porównać. Dla nazw z małej lub przewidywalnej przestrzeni UUID v3 nie zapewnia żadnej poufności. Użyj UUID v4, jeśli potrzebujesz nieprzejrzystego, nieuodgadnionego identyfikatora.