سازنده UUID
ابزار حرفهای تولید و اعتبارسنج UUID که از نسخههای مختلف UUID از جمله v1 (مهر زمانی)، v4 (تصادفی)، v5 (مبتنی بر نام) و v7 (زمان یونیکس + تصادفی) پشتیبانی میکند. ارائه تولید دستهای با تعداد قابل تنظیم، گزینههای فرمتبندی انعطافپذیر شامل تبدیل به حروف بزرگ، حذف خط تیره و افزودن آکولاد. شامل اعتبارسنج UUID داخلی با تشخیص نسخه و ارائه مثالهای کد چندزبانه. مناسب برای شناسایی رکوردهای پایگاه داده، ردیابی لاگ، رابطهای بین سیستمی و سایر موارد کاربرد. همه عملیات به صورت محلی در مرورگر شما انجام میشود تا حریم خصوصی و امنیت تضمین شود.
راهنمای استفاده
ویژگیها
- پشتیبانی از UUID نسخه 1، 4، 5 و 7
- تولید دستهجمعی با تعداد قابل تنظیم
- قالببندی انعطافپذیر: حروف بزرگ، حذف خط تیره، افزودن آکولاد
- اعتبارسنج داخلی با تشخیص خودکار نسخه
- پشتیبانی کامل از بینالمللیسازی و چند تم
UUID چیست؟
UUID ها شناسههای ۱۲۸ بیتی هستند که معمولاً به صورت رشتههایی با ۳۶ کاراکتر و خط تیره نمایش داده میشوند.
UUID v1: بر اساس مهر زمانی و آدرس MAC است؛ زمان ترتیبی است اما ممکن است اطلاعات زمانی یا مکانی را افشا کند.
UUID نسخه 4: به صورت تصادفی تولید میشود، بیشترین کاربرد را دارد و یکتایی و حریم خصوصی قوی ارائه میدهد.
UUID نسخه 7: بر اساس میلیثانیههای یونیکس + بیتهای تصادفی ساخته میشود؛ به طور طبیعی قابل مرتبسازی است و از مشکلات حریم خصوصی نسخه 1 جلوگیری میکند.
UUID نسخه 5: به صورت قطعی از یک UUID فضای نام و نام با استفاده از SHA-1 تولید میشود؛ ورودیهای یکسان همیشه خروجی یکسانی تولید میکنند.
UUID موارد کاربرد رایج
- شناسههای یکتای رکوردها یا منابع پایگاه داده
- شناسههای ردیابی برای ثبت رویدادها و پیگیری فعالیتها
- شناسههای عمومی غیرقابل پیشبینی
- شناسههای یکپارچه در طول ادغام سیستمها
UUID سوالات متداول و نکات
- نسخه 1 و حریم خصوصی: نسخه 1 میتواند مهرهای زمانی یا مکان سختافزار را افشا کند؛ برای موارد حساس به حریم خصوصی از نسخه 4 استفاده کنید.
- حساسیت به حروف: تطبیق UUID حساس به حروف نیست.
- خط تیرهها صرفاً برای خوانایی هستند؛ مگر اینکه توسط سیستمهای قدیمیتر محدود شود، میتوانید آنها را حفظ کنید.
- فرمت با آکولاد (مثلاً {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}) در برخی محیطها مانند رجیستری ویندوز پذیرفته میشود.
- نسخه 5 قطعی است: فضای نام + نام یکسان => UUID یکسان. برای عملیات idempotent ایدهآل است؛ هنگامی که غیرقابل پیشبینی بودن لازم است از آن خودداری کنید.
نحوه استفاده از UUID در زبانهای برنامهنویسی
// UUID v4 (simple)
function uuidv4(){
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = Math.random()*16|0, v = c === 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
}
const id = uuidv4();
// UUID v7 (Unix ms + randomness)
function uuidv7(){
const cryptoObj = (globalThis.crypto || globalThis.msCrypto);
const rb = n => { const a = new Uint8Array(n); cryptoObj?.getRandomValues ? cryptoObj.getRandomValues(a) : a.forEach((_,i)=>a[i]=Math.random()*256|0); return a; };
const hex = b => Array.from(b).map(x=>x.toString(16).padStart(2,'0')).join('');
const ts = BigInt(Date.now()).toString(16).padStart(12,'0');
const ver = rb(2); ver[0] = (ver[0] & 0x0f) | 0x70; // set version 7
const vrn = rb(2); vrn[0] = (vrn[0] & 0x3f) | 0x80; // RFC4122 variant
const tail = rb(6);
return `${ts.slice(0,8)}-${ts.slice(8,12)}-${hex(ver)}-${hex(vrn)}-${hex(tail)}`;
}
const id7 = uuidv7();
const re=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
re.test(id); // true/false
<?php
// v4 using random_bytes
function uuidv4(){
$data = random_bytes(16);
$data[6] = chr((ord($data[6]) & 0x0f) | 0x40);
$data[8] = chr((ord($data[8]) & 0x3f) | 0x80);
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
$id = uuidv4();
<?php
// composer require ramsey/uuid:^4.7
use Ramsey\Uuid\Uuid;
$uuid7 = Uuid::uuid7();
<?php
$re = '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i';
preg_match($re, $id) === 1; // true/false
import uuid
# v4
uid = uuid.uuid4()
# v1
uid1 = uuid.uuid1()
# pip install uuid6
from uuid6 import uuid7
uid7 = uuid7()
import re
re_uuid = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-57][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', re.I)
bool(re_uuid.match(str(uid)))
// go get github.com/google/uuid
import "github.com/google/uuid"
id := uuid.New() // v4
id1 := uuid.NewUUID() // v1 (may return error)
// go get github.com/gofrs/uuid/v5
import (
uuid "github.com/gofrs/uuid/v5"
)
id7, err := uuid.NewV7()
import "github.com/google/uuid"
_, err := uuid.Parse(id.String()) // err == nil means valid
// Cargo.toml: uuid = { version = "1", features = ["v4", "v1"] }
use uuid::Uuid;
let v4 = Uuid::new_v4();
// v1 requires a context/ts, often via external crate; shown for completeness
// Cargo.toml: uuid = { version = "1", features = ["v7"] }
use uuid::Uuid;
let v7 = Uuid::now_v7();
use uuid::Uuid;
let ok = Uuid::parse_str(v4.to_string().as_str()).is_ok();
import java.util.UUID;
UUID id = UUID.randomUUID(); // v4
// Maven: com.github.f4b6a3:uuid-creator
import com.github.f4b6a3.uuid.UuidCreator;
UUID v7 = UuidCreator.getTimeOrderedEpoch(); // UUIDv7
import java.util.UUID;
try { UUID.fromString(id.toString()); /* valid */ } catch (IllegalArgumentException ex) { /* invalid */ }