UUID v3 Generator
Menghasilkan UUID v3 deterministik berbasis nama menggunakan MD5
Namespace
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Nama
UUID v3 yang Dibuat
Apa itu UUID v3?
UUID v3 adalah versi UUID berbasis nama yang didefinisikan dalam RFC 4122. Alih-alih data acak atau timestamp, UUID v3 menurunkan UUID secara deterministik dari dua input: UUID namespace dan string nama.
Properti kunci UUID v3 adalah determinisme: namespace dan nama yang sama akan selalu menghasilkan UUID yang identik, di mesin mana pun, kapan pun.
UUID v3 menggunakan MD5 sebagai fungsi hash. MD5 dianggap rusak secara kriptografi untuk tujuan keamanan, itulah mengapa UUID v5 (yang menggunakan SHA-1) umumnya lebih disukai untuk pengembangan baru.
Namespace Standar
RFC 4122 mendefinisikan empat UUID namespace yang telah ditetapkan sebelumnya:
| Namespace | UUID | Gunakan untuk |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Nama domain yang sepenuhnya memenuhi syarat (misalnya 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL dan URI (misalnya 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | Object Identifier ISO (misalnya '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | Distinguished Name X.500 (misalnya 'cn=John,dc=example,dc=com') |
Anda juga dapat menggunakan UUID arbitrer apa pun sebagai namespace kustom.
UUID v3 vs UUID v5
UUID v3 dan UUID v5 identik secara struktural — keduanya adalah UUID deterministik berbasis nama. Satu-satunya perbedaan adalah fungsi hash:
- Menggunakan hashing MD5
- Output 128-bit (ukuran UUID)
- Didefinisikan dalam RFC 4122
- MD5 rusak secara kriptografi
- Didukung oleh semua library UUID
- Menggunakan hashing SHA-1
- Hash 160-bit dipotong menjadi 128 bit
- Didefinisikan dalam RFC 4122
- SHA-1 tidak digunakan lagi untuk keamanan tetapi lebih kuat dari MD5
- Didukung oleh semua library UUID
Lebih pilih UUID v5 daripada UUID v3 untuk semua pengembangan baru.
Kapan Menggunakan UUID v3
UUID v3 (dan v5) tepat ketika Anda membutuhkan identifier yang stabil dan dapat direproduksi yang diturunkan dari nama yang bermakna:
Memahami Determinisme
Determinisme UUID v3 adalah kekuatan terbesarnya sekaligus batasannya yang paling penting.
Selalu menghasilkan: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Jika penyerang mengetahui namespace dan dapat menebak namanya, mereka dapat menghitung nilai UUID v3 terlebih dahulu. Nilai UUID v3 tidak boleh digunakan sebagai token yang tidak dapat ditebak.
Contoh Kode
UUID v3 memerlukan UUID namespace dan string nama. Gunakan paket uuid standar:
// 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)
}