ToolDeck

UUID v3 Generator

Generate deterministic name-based UUID v3 using MD5

Namespace

6ba7b810-9dad-11d1-80b4-00c04fd430c8

Name

Generated UUID v3

Enter a name and click Generate
Same namespace + name always produces the same UUID
Note:UUID v3 یک فرمت قدیمی است که از هش‌گذاری MD5 استفاده می‌کند. برای توسعه جدید که به UUID قطعی نیاز دارد، UUID v5 (SHA-1) را ترجیح دهید. برای شناسه‌های یکتای عمومی، از UUID v4 استفاده کنید.

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کاربرد
DNS6ba7b810-9dad-11d1-80b4-00c04fd430c8نام‌های دامنه کاملاً واجد شرایط (مثلاً 'example.com')
URL6ba7b811-9dad-11d1-80b4-00c04fd430c8URL‌ها و URIها (مثلاً 'https://example.com/resource')
OID6ba7b812-9dad-11d1-80b4-00c04fd430c8شناسه‌های شیء ISO (مثلاً '1.2.840.113556')
X.5006ba7b814-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 قطعی و مبتنی بر نام هستند. تنها تفاوت تابع هش است:

UUID v3
  • از هش‌گذاری MD5 استفاده می‌کند
  • خروجی ۱۲۸ بیتی (اندازه UUID)
  • تعریف‌شده در RFC 4122
  • MD5 از نظر رمزنگاری شکسته‌شده است
  • توسط همه کتابخانه‌های UUID پشتیبانی می‌شود
UUID v5
  • از هش‌گذاری SHA-1 استفاده می‌کند
  • هش ۱۶۰ بیتی کوتاه‌شده به ۱۲۸ بیت
  • تعریف‌شده در RFC 4122
  • SHA-1 برای استفاده امنیتی منسوخ اما قوی‌تر از MD5 است
  • توسط همه کتابخانه‌های UUID پشتیبانی می‌شود

برای تمام توسعه جدید، UUID v5 را بر UUID v3 ترجیح دهید. هش SHA-1 قوی‌تر از MD5 است و تفاوت عملکرد ناچیز است. از UUID v3 فقط زمانی استفاده کنید که نیاز به بازتولید UUID از سیستمی دارید که از آن استفاده می‌کند.

چه زمانی از UUID v3 استفاده کنیم

UUID v3 (و v5) زمانی مناسب هستند که به یک شناسه پایدار و قابل بازتولید نیاز دارید که از یک نام معنادار مشتق شده باشد — به‌جای یک شناسه تصادفی که باید ذخیره و جستجو شود:

استانداردسازی URL
یک UUID قطعی برای هر URL تولید کنید تا به‌عنوان یک کلید فشرده با طول ثابت در پایگاه داده یا کش استفاده شود — بدون نگه‌داشتن جدول نگاشت.
شناسه‌های مبتنی بر DNS
UUID‌های پایدار به نام‌های میزبان یا نام‌های دامنه اختصاص دهید که در طول استقرارها و پایگاه‌های داده ثابت بمانند.
آدرس‌دهی محتوا
شناسه‌های قابل بازتولید برای آیتم‌های محتوا ایجاد کنید که با نام کانونیکال‌شان شناسایی می‌شوند — مقالات، محصولات یا کلیدهای پیکربندی.
ایجاد منابع idempotent
همان UUID را برای همان نام منبع تولید کنید، تا تلاش‌های مکرر ایجاد به‌طور طبیعی idempotent باشند بدون نیاز به جستجو.
داده‌های آزمایشی ثابت
UUID‌های پایدار و قابل پیش‌بینی در داده‌های آزمایش تولید کنید تا assertion‌های تست نیازی به به‌روزرسانی هنگام اجرای مجدد نداشته باشند.
حذف تکراری بین سیستم‌ها
دو سیستم مستقل می‌توانند UUID یکسانی برای نام یکسان بدون ارتباط با یکدیگر تولید کنند و حذف تکراری را بدون یک رجیستری شناسه مشترک ممکن می‌سازند.

درک قطعی‌بودن

UUID v3 کاملاً قطعی است: با هر UUID فضای نام و هر رشته نامی، UUID خروجی همیشه یکسان است — هیچ تصادفی‌بودنی وجود ندارد. این همچنین به این معنی است:

مثال (فضای نام DNS، نام = 'example.com'):9073926b-929f-31c2-abc9-fad77ae3e8eb

همیشه تولید می‌کند: 9073926b-929f-31c2-abc9-fad77ae3e8eb

اگر مهاجمی فضای نام را بداند و بتواند نام را حدس بزند، می‌تواند UUID را از پیش محاسبه کند. مقادیر UUID v3 هرگز نباید به‌عنوان توکن‌های غیرقابل پیش‌بینی، شناسه‌های نشست یا اسرار استفاده شوند. برای هر شناسه حساس به امنیت از UUID v4 استفاده کنید.

نمونه کد

UUID v3 به یک UUID فضای نام و یک رشته نام نیاز دارد. از پکیج استاندارد uuid استفاده کنید:

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)
}

سوالات متداول

آیا UUID v3 و UUID v5 قابل تعویض هستند؟
خیر — آنها خروجی‌های متفاوتی برای ورودی‌های یکسان تولید می‌کنند چون از توابع هش متفاوتی (MD5 در مقابل SHA-1) استفاده می‌کنند. یک UUID v3 و یک UUID v5 تولیدشده از فضای نام + نام یکسان، UUID‌های متفاوتی خواهند بود. آنها قابل تعویض نیستند، اما از نظر ساختار و موارد استفاده معادل عملکردی هستند.
آیا UUID v3 در برابر برخورد مقاوم است؟
در یک فضای نام مشخص، دو نام متفاوت UUID v3 متفاوتی تولید می‌کنند مادامی که MD5 برای آن ورودی‌های خاص برخورد ایجاد نکند. حملات برخورد MD5 وجود دارند، اما به ورودی‌های دقیقاً طراحی‌شده نیاز دارند — در عمل، نام‌های طبیعی (URL‌ها، نام‌های دامنه، شناسه‌های محصول) برخورد نخواهند داشت. برای اطمینان بیشتر از UUID v5 استفاده کنید.
آیا می‌توانم از UUID v3 به‌عنوان کلید اصلی در پایگاه داده استفاده کنم؟
بله، اگر مبادلات را درک کنید. UUID v3 قطعی است، بنابراین همان کلید برای همان نام تولید می‌شود — این idempotency طبیعی را فراهم می‌کند. با این حال، UUID v3 بر اساس ترتیب تولید قابل مرتب‌سازی نیست و تکه‌تکه‌شدن ایندکس درست مانند UUID v4 اعمال می‌شود. برای کلیدهای اصلی مرتب‌شده بر اساس زمان، از UUID v7 استفاده کنید.
باید از چه رمزگذاری‌ای برای ورودی نام استفاده کنم؟
RFC 4122 مشخص می‌کند که نام باید با استفاده از فرم کانونیکال فضای نام به بایت تبدیل شود. برای فضای نام DNS، از نام دامنه به‌عنوان رشته UTF-8 بدون نقطه انتهایی استفاده کنید. برای فضای نام URL، از URL کامل به‌عنوان رشته UTF-8 استفاده کنید. همیشه از رمزگذاری یکسانی به‌طور مداوم استفاده کنید — رمزگذاری‌های متفاوت از همان نام منطقی UUID‌های متفاوتی تولید می‌کنند.
آیا UUID v3 نام اصلی را پنهان می‌کند؟
MD5 یک تابع یک‌طرفه است — نمی‌توانید UUID v3 را معکوس کنید تا نام اصلی را بازیابی کنید. با این حال، اگر مهاجمی فضای نام را بداند و مجموعه کوچکی از نام‌های ممکن را مشکوک بداند، می‌تواند مقادیر UUID v3 را برای هر کاندیدا از پیش محاسبه و مقایسه کند. برای نام‌هایی از یک فضای کوچک یا قابل پیش‌بینی، UUID v3 هیچ محرمانگی‌ای فراهم نمی‌کند. اگر به یک شناسه غیرشفاف و غیرقابل حدس نیاز دارید از UUID v4 استفاده کنید.