UUID v3 چیست؟
UUID v3 یک نسخه UUID مبتنی بر نام است که در RFC 4122 تعریف شده است. بهجای داده تصادفی یا تایماستمپ، UUID را بهصورت قطعی از دو ورودی مشتق میکند: یک UUID فضای نام و یک رشته نام. جفت فضای نام + نام با MD5 هش میشود و هش حاصل بهصورت UUID قالببندی میشود.
ویژگی اصلی UUID v3 قطعیبودن آن است: فضای نام و نام یکسان همیشه UUID یکسانی تولید میکنند، روی هر دستگاهی، در هر زمانی. این ویژگی آن را برای آدرسدهی محتوا مناسب میکند — تولید شناسههای پایدار برای منابعی که با یک نام معنادار شناسایی میشوند.
UUID v3 از MD5 بهعنوان تابع هش استفاده میکند. MD5 از نظر رمزنگاری شکستهشده تلقی میشود، به همین دلیل UUID v5 (که از SHA-1 استفاده میکند) معمولاً برای توسعه جدید ترجیح داده میشود. نه v3 و نه v5 هیچ تصادفیبودنی ندارند — هر دو کاملاً قطعی هستند.
فضاهای نام استاندارد
RFC 4122 چهار UUID فضای نام از پیش تعیینشده تعریف میکند. استفاده از فضای نام استاندارد قابلیت همکاری را تضمین میکند — دو پیادهسازی مستقل، UUID v3 یکسانی برای نام یکسان در فضای نام یکسان تولید میکنند:
| فضای نام | UUID | کاربرد |
|---|---|---|
| DNS | 6ba7b810-9dad-11d1-80b4-00c04fd430c8 | نامهای دامنه کاملاً واجد شرایط (مثلاً 'example.com') |
| URL | 6ba7b811-9dad-11d1-80b4-00c04fd430c8 | URLها و URIها (مثلاً 'https://example.com/resource') |
| OID | 6ba7b812-9dad-11d1-80b4-00c04fd430c8 | شناسههای شیء ISO (مثلاً '1.2.840.113556') |
| X.500 | 6ba7b814-9dad-11d1-80b4-00c04fd430c8 | نامهای متمایز X.500 (مثلاً 'cn=John,dc=example,dc=com') |
همچنین میتوانید از هر UUID دلخواهی بهعنوان فضای نام سفارشی استفاده کنید — برای مثال، یک UUID v4 که یکبار تولید کرده و بهعنوان ثابت در برنامه خود جاسازی میکنید. این به شما امکان میدهد یک فضای نام خصوصی برای نگاشتهای نام به UUID خود ایجاد کنید.
UUID v3 در مقابل UUID v5
UUID v3 و UUID v5 از نظر ساختاری یکسان هستند — هر دو UUID قطعی و مبتنی بر نام هستند. تنها تفاوت تابع هش است:
- از هشگذاری MD5 استفاده میکند
- خروجی ۱۲۸ بیتی (اندازه UUID)
- تعریفشده در RFC 4122
- MD5 از نظر رمزنگاری شکستهشده است
- توسط همه کتابخانههای UUID پشتیبانی میشود
- از هشگذاری SHA-1 استفاده میکند
- هش ۱۶۰ بیتی کوتاهشده به ۱۲۸ بیت
- تعریفشده در RFC 4122
- SHA-1 برای استفاده امنیتی منسوخ اما قویتر از MD5 است
- توسط همه کتابخانههای UUID پشتیبانی میشود
برای تمام توسعه جدید، UUID v5 را بر UUID v3 ترجیح دهید. هش SHA-1 قویتر از MD5 است و تفاوت عملکرد ناچیز است. از UUID v3 فقط زمانی استفاده کنید که نیاز به بازتولید UUID از سیستمی دارید که از آن استفاده میکند.
چه زمانی از UUID v3 استفاده کنیم
UUID v3 (و v5) زمانی مناسب هستند که به یک شناسه پایدار و قابل بازتولید نیاز دارید که از یک نام معنادار مشتق شده باشد — بهجای یک شناسه تصادفی که باید ذخیره و جستجو شود:
درک قطعیبودن
UUID v3 کاملاً قطعی است: با هر UUID فضای نام و هر رشته نامی، UUID خروجی همیشه یکسان است — هیچ تصادفیبودنی وجود ندارد. این همچنین به این معنی است:
همیشه تولید میکند: 9073926b-929f-31c2-abc9-fad77ae3e8eb
اگر مهاجمی فضای نام را بداند و بتواند نام را حدس بزند، میتواند UUID را از پیش محاسبه کند. مقادیر UUID v3 هرگز نباید بهعنوان توکنهای غیرقابل پیشبینی، شناسههای نشست یا اسرار استفاده شوند. برای هر شناسه حساس به امنیت از UUID v4 استفاده کنید.
نمونه کد
UUID v3 به یک UUID فضای نام و یک رشته نام نیاز دارد. از پکیج استاندارد 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)
}