UUID v3 Üretici

MD5 kullanarak ad tabanlı deterministik UUID v3 oluşturur

Ad Alanı

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

Ad

Oluşturulan UUID v3

Bir ad girin ve Oluştur'a tıklayın
Aynı ad alanı + ad her zaman aynı UUID'yi üretir
Note:UUID v3, MD5 karma kullanan eski bir biçimdir. Deterministik UUID gerektiren yeni geliştirmeler için UUID v5'i (SHA-1) tercih edin. Genel amaçlı benzersiz ID'ler için UUID v4 kullanın.

UUID v3 Nedir?

UUID v3, RFC 4122'de tanımlanan ad tabanlı UUID sürümüdür. Rastgele veri veya zaman damgası yerine UUID'yi iki girdiden deterministik olarak türetir: bir ad alanı UUID'si ve bir ad dizesi. MD5 kullanılarak karma değer oluşturulur.

UUID v3'ün temel özelliği determinizmdir: aynı ad alanı ve ad her zaman herhangi bir makinede, herhangi bir zamanda aynı UUID'yi üretir.

UUID v3, MD5 karma işlevini kullanır. MD5, güvenlik amaçlı kriptografik açıdan kırık kabul edildiğinden yeni geliştirmeler için genellikle UUID v5 (SHA-1 kullanan) tercih edilir.

Standart Ad Alanları

RFC 4122, dört önceden atanmış ad alanı UUID'si tanımlar. Standart ad alanı kullanmak birlikte çalışabilirliği sağlar:

Ad AlanıUUIDKullanım Amacı
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Tam nitelikli alan adları (ör. 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL'ler ve URI'ler (ör. 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8ISO Nesne Tanımlayıcıları (ör. '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8X.500 Ayırt Edici Adları (ör. 'cn=John,dc=example,dc=com')

Herhangi bir UUID'yi özel ad alanı olarak da kullanabilirsiniz.

UUID v3 ile UUID v5 Karşılaştırması

UUID v3 ve UUID v5 yapısal olarak özdeştir — her ikisi de deterministik, ad tabanlı UUID'lerdir. Tek fark karma işlevidir:

UUID v3
  • MD5 karma kullanır
  • 128 bitlik çıktı (UUID boyutunda)
  • RFC 4122'de tanımlandı
  • MD5 kriptografik açıdan kırıktır
  • Tüm UUID kitaplıkları tarafından desteklenir
UUID v5
  • SHA-1 karma kullanır
  • 160 bitlik karma 128 bite kısaltıldı
  • RFC 4122'de tanımlandı
  • SHA-1 güvenlik kullanımı için kullanımdan kaldırıldı ama MD5'ten güçlü
  • Tüm UUID kitaplıkları tarafından desteklenir

Tüm yeni geliştirmeler için UUID v3 yerine UUID v5'i tercih edin. SHA-1 karması MD5'ten güçlüdür.

UUID v3 Ne Zaman Kullanılır

UUID v3 (ve v5), depolanıp aranması gereken rastgele bir ID yerine anlamlı bir addan türetilmiş kararlı, yeniden üretilebilir tanımlayıcıya ihtiyaç duyduğunuzda uygundur:

URL kanonikleştirme
Bir veritabanında veya önbellekte kompakt, sabit uzunluklu anahtar olarak kullanmak üzere herhangi bir URL için deterministik UUID oluşturun.
DNS tabanlı tanımlayıcılar
Ana bilgisayar adlarına veya alan adlarına, dağıtımlar ve veritabanlarında tutarlı kalan kararlı UUID'ler atayın.
İçerik adresleme
Kurallı adlarıyla tanımlanan içerik öğeleri için yeniden üretilebilir ID'ler oluşturun.
İdempotent kaynak oluşturma
Aynı kaynak adı için aynı UUID'yi oluşturun, böylece yinelenen oluşturma girişimleri doğal olarak idempotent olur.
Test armatürleri
Test verilerinde kararlı, öngörülebilir UUID'ler üretin.
Sistemler arası tekilleştirme
İki bağımsız sistem, iletişim kurmadan aynı ad için aynı UUID'yi türetebilir.

Determinizmi Anlamak

UUID v3'ün determinizmi hem en büyük güçlü yönü hem de en önemli kısıtlamasıdır.

Örnek (DNS ad alanı, ad = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

Her zaman üretir: 9073926b-929f-31c2-abc9-fad77ae3e8eb

Bir saldırgan ad alanını biliyorsa ve adı tahmin edebiliyorsa UUID'yi önceden hesaplayabilir. UUID v3 değerleri asla tahmin edilemez token, oturum ID'si veya gizli dizi olarak kullanılmamalıdır.

Kod Örnekleri

UUID v3, bir ad alanı UUID'si ve ad dizesi gerektirir. Standart uuid paketini kullanın:

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

Sıkça Sorulan Sorular

UUID v3 ve UUID v5 birbirinin yerine kullanılabilir mi?
Hayır — farklı karma işlevleri (MD5 ve SHA-1) kullandıklarından aynı girdiler için farklı çıktılar üretirler.
UUID v3 çakışmaya dayanıklı mı?
Belirli bir ad alanında MD5 çakışması üretmedikçe iki farklı ad farklı UUID v3 değerleri üretir. MD5 çakışma saldırıları var olsa da dikkatlice oluşturulmuş girdiler gerektirir.
UUID v3'ü veritabanında birincil anahtar olarak kullanabilir miyim?
Evet, ancak değiş tokuşları anlarsanız. UUID v3, sıralanabilir değildir ve dizin parçalanması UUID v4'te olduğu gibi geçerlidir.
Ad girişi için hangi kodlamayı kullanmalıyım?
RFC 4122, adın ad alanının kanonik biçimi kullanılarak baytlara dönüştürülmesi gerektiğini belirtir. DNS ad alanı için sondaki nokta olmadan UTF-8 dizesi olarak alan adını kullanın.
UUID v3 orijinal adı gizler mi?
MD5 tek yönlü bir işlevdir — UUID v3'ten orijinal adı kurtaramazsınız. Ancak bir saldırgan ad alanını biliyorsa ve olası adların küçük bir kümesini tahmin ediyorsa önceden hesaplayıp karşılaştırabilir.