เครื่องสร้าง UUID v3
สร้าง UUID v3 แบบ deterministic ตามชื่อโดยใช้ MD5
Namespace
6ba7b810-9dad-11d1-80b4-00c04fd430c8
ชื่อ
UUID v3 ที่สร้างแล้ว
UUID v3 คืออะไร?
UUID v3 คือ UUID version name-based ที่กำหนดใน RFC 4122 แทนที่จะใช้ข้อมูลสุ่มหรือ timestamp มันได้ UUID แบบ deterministic จากสองอินพุต: UUID namespace และ string name คู่ namespace + name ถูก hash ด้วย MD5 และ hash ที่ได้ format เป็น UUID
คุณสมบัติหลักของ UUID v3 คือ determinism: namespace และ name เดิมจะให้ UUID เดิมเสมอ บนเครื่องใดก็ตาม ในเวลาใดก็ตาม ทำให้เหมาะสำหรับ content-addressing — การสร้าง identifier ที่เสถียรสำหรับ resource ที่ระบุด้วยชื่อที่มีความหมาย
UUID v3 ใช้ MD5 เป็น hash function MD5 ถือว่าเสียหายทางการเข้ารหัสสำหรับวัตถุประสงค์ด้านความปลอดภัย ซึ่งเป็นเหตุผลที่ UUID v5 (ใช้ SHA-1) มักถูกแนะนำสำหรับการพัฒนาใหม่ ทั้ง v3 และ v5 ไม่มีความสุ่มเลย — เป็น deterministic ล้วน
Namespace มาตรฐาน
RFC 4122 กำหนด namespace UUID ที่กำหนดไว้ล่วงหน้าสี่รายการ การใช้ namespace มาตรฐานรับประกันความสามารถทำงานร่วมกัน — สอง implementation อิสระจะสร้าง UUID v3 เดิมสำหรับ name เดิมใน namespace เดิม:
| Namespace | UUID | ใช้สำหรับ |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Fully qualified domain name (เช่น 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL และ URI (เช่น 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | ISO Object Identifier (เช่น '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | X.500 Distinguished Name (เช่น 'cn=John,dc=example,dc=com') |
คุณยังสามารถใช้ UUID ใดก็ตามเป็น custom namespace เช่น UUID v4 ที่คุณสร้างครั้งเดียวและฝังในแอปพลิเคชันเป็นค่าคงที่ ทำให้คุณสร้าง private namespace สำหรับ name-to-UUID mapping ของตัวเอง
UUID v3 vs UUID v5
UUID v3 และ UUID v5 มีโครงสร้างเหมือนกัน — ทั้งคู่เป็น UUID แบบ deterministic, name-based ความแตกต่างเดียวคือ hash function:
- ใช้ MD5 hashing
- output 128 บิต (ขนาด UUID)
- กำหนดใน RFC 4122
- MD5 เสียหายทางการเข้ารหัส
- รองรับโดย UUID library ทั้งหมด
- ใช้ SHA-1 hashing
- SHA-1 hash 160 บิตตัดทอนเหลือ 128 บิต
- กำหนดใน RFC 4122
- SHA-1 เลิกใช้สำหรับด้านความปลอดภัยแต่แข็งแกร่งกว่า MD5
- รองรับโดย UUID library ทั้งหมด
เลือก UUID v5 แทน UUID v3 สำหรับการพัฒนาใหม่ทั้งหมด SHA-1 hash แข็งแกร่งกว่า MD5 และความแตกต่างด้านประสิทธิภาพไม่มีนัยสำคัญ ใช้ UUID v3 เฉพาะเมื่อต้องสร้าง UUID ซ้ำจากระบบที่ใช้มันอยู่แล้ว
เมื่อไรควรใช้ UUID v3
UUID v3 (และ v5) เหมาะเมื่อต้องการ identifier ที่เสถียรและสร้างซ้ำได้จากชื่อที่มีความหมาย แทนที่จะเป็น random ID ที่ต้องเก็บและค้นหา:
เข้าใจ Determinism
Determinism ของ UUID v3 เป็นทั้งจุดแข็งที่ยิ่งใหญ่ที่สุดและข้อจำกัดที่สำคัญที่สุด ด้วย namespace UUID ใดก็ตาม และ name string ใดก็ตาม UUID output จะ fixed อย่างสมบูรณ์ — ไม่มีความสุ่มเข้ามาเกี่ยวข้อง ซึ่งหมายความว่า:
ให้เสมอ: 9073926b-929f-31c2-abc9-fad77ae3e8eb
หากผู้โจมตีรู้ namespace และสามารถเดา name ได้ พวกเขาสามารถคำนวณ UUID ล่วงหน้าได้ ค่า UUID v3 ไม่ควรใช้เป็น token ที่ไม่สามารถคาดเดา, session ID หรือ secret ใช้ UUID v4 สำหรับ identifier ที่ sensitive ด้านความปลอดภัย
ตัวอย่างโค้ด
UUID v3 ต้องการ namespace UUID และ name string ใช้ standard package 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)
}