Trình tạo UUID v3
Tạo UUID v3 tất định dựa trên tên sử dụng MD5
Không gian tên
6ba7b810-9dad-11d1-80b4-00c04fd430c8
Tên
UUID v3 đã tạo
UUID v3 là gì?
UUID v3 là phiên bản UUID dựa trên tên được định nghĩa trong RFC 4122. Thay vì dữ liệu ngẫu nhiên hoặc timestamp, UUID v3 dẫn xuất UUID một cách xác định từ hai đầu vào: UUID namespace và chuỗi tên.
Thuộc tính chính của UUID v3 là tính xác định: cùng namespace và tên sẽ luôn tạo ra UUID giống hệt nhau, trên bất kỳ máy nào, vào bất kỳ thời điểm nào.
UUID v3 sử dụng MD5 làm hàm hash. MD5 được coi là bị phá vỡ về mặt mật mã cho các mục đích bảo mật, đó là lý do tại sao UUID v5 (sử dụng SHA-1) thường được ưu tiên hơn cho phát triển mới.
Namespace Tiêu chuẩn
RFC 4122 định nghĩa bốn UUID namespace được chỉ định trước:
| Namespace | UUID | Dùng cho |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | Tên miền đủ điều kiện (ví dụ 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URL và URI (ví dụ 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | Object Identifier ISO (ví dụ '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | Distinguished Name X.500 (ví dụ 'cn=John,dc=example,dc=com') |
Bạn cũng có thể sử dụng bất kỳ UUID tùy ý nào làm namespace tùy chỉnh.
UUID v3 so với UUID v5
UUID v3 và UUID v5 về mặt cấu trúc là giống hệt nhau — cả hai đều là UUID xác định dựa trên tên. Sự khác biệt duy nhất là hàm hash:
- Sử dụng hashing MD5
- Đầu ra 128-bit (kích thước UUID)
- Được định nghĩa trong RFC 4122
- MD5 bị phá vỡ về mặt mật mã
- Được hỗ trợ bởi tất cả thư viện UUID
- Sử dụng hashing SHA-1
- Hash 160-bit được cắt xuống 128 bit
- Được định nghĩa trong RFC 4122
- SHA-1 không còn được dùng cho bảo mật nhưng mạnh hơn MD5
- Được hỗ trợ bởi tất cả thư viện UUID
Ưu tiên UUID v5 hơn UUID v3 cho tất cả phát triển mới.
Khi nào nên dùng UUID v3
UUID v3 (và v5) phù hợp khi bạn cần định danh ổn định, có thể tái tạo được dẫn xuất từ tên có ý nghĩa:
Hiểu về Tính xác định
Tính xác định của UUID v3 vừa là điểm mạnh lớn nhất vừa là ràng buộc quan trọng nhất của nó.
Luôn tạo ra: 9073926b-929f-31c2-abc9-fad77ae3e8eb
Nếu kẻ tấn công biết namespace và có thể đoán tên, chúng có thể tính toán trước các giá trị UUID v3. Các giá trị UUID v3 không bao giờ nên được sử dụng làm token không thể đoán được.
Ví dụ Mã
UUID v3 yêu cầu UUID namespace và chuỗi tên. Sử dụng gói uuid tiêu chuẩn:
// 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)
}