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

Nhập tên và nhấn Tạo
Cùng không gian tên + tên luôn tạo ra cùng UUID
Note:UUID v3 là định dạng cũ sử dụng hashing MD5. Để phát triển mới yêu cầu UUID xác định, hãy ưu tiên UUID v5 (SHA-1). Để có ID duy nhất đa mục đích, hãy sử dụng UUID v4.

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:

NamespaceUUIDDùng cho
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8Tên miền đủ điều kiện (ví dụ 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL và URI (ví dụ 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8Object Identifier ISO (ví dụ '1.2.840.113556')
X.5006ba7b814-9dad-11d1-80b4-00c04fd430c8Distinguished 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:

UUID v3
  • 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
UUID v5
  • 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:

Chuẩn hóa URL
Tạo UUID xác định cho bất kỳ URL nào để sử dụng làm khóa độ dài cố định, nhỏ gọn trong database hoặc cache.
Định danh dựa trên DNS
Gán UUID ổn định cho tên máy chủ hoặc tên miền nhất quán qua các lần triển khai.
Địa chỉ hóa nội dung
Tạo ID có thể tái tạo cho các mục nội dung được xác định bởi tên chính tắc của chúng.
Tạo tài nguyên idempotent
Tạo cùng UUID cho cùng tên tài nguyên, vì vậy các lần tạo lặp lại là idempotent một cách tự nhiên.
Fixture kiểm tra
Tạo UUID ổn định, có thể dự đoán trong dữ liệu kiểm tra.
Loại trùng lặp đa hệ thống
Hai hệ thống độc lập có thể dẫn xuất cùng UUID cho cùng tên mà không cần giao tiếp.

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ó.

Ví dụ (namespace DNS, tên = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

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 namespacechuỗi tên. Sử dụng gói uuid tiêu chuẩ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)
}

Câu hỏi Thường gặp

UUID v3 và UUID v5 có thể hoán đổi cho nhau không?
Không — chúng tạo ra đầu ra khác nhau cho cùng đầu vào vì sử dụng các hàm hash khác nhau (MD5 so với SHA-1).
UUID v3 có kháng va chạm không?
Trong một namespace nhất định, hai tên khác nhau sẽ tạo ra các giá trị UUID v3 khác nhau miễn là MD5 không tạo ra va chạm cho các đầu vào đó.
Tôi có thể sử dụng UUID v3 làm khóa chính database không?
Có, nếu bạn hiểu các đánh đổi. UUID v3 là xác định, vì vậy cùng tên sẽ tạo ra cùng khóa.
Tôi nên sử dụng mã hóa nào cho đầu vào tên?
RFC 4122 chỉ định rằng tên phải được chuyển đổi thành byte sử dụng dạng chính tắc của namespace.
UUID v3 có ẩn tên gốc không?
MD5 là hàm một chiều — bạn không thể đảo ngược UUID v3 để lấy lại tên gốc.