ابزار تولید UUID
تولید و اعتبارسنجی UUID (v1، v4، v5، v7) با پشتیبانی از تولید انبوه و گزینههای فرمتبندی متعدد، همراه با نمونههای کد چندزبانه.
راهنمای استفاده
UUID یک شناسه 128 بیتی است که به صورت استاندارد به صورت 36 کاراکتر با خط تیره نمایش داده میشود.
UUID v1: مبتنی بر استامپ زمانی و اطلاعات کارت شبکه، ترتیب زمانی دارد اما ممکن است زمان/موقعیت را آشکار کند.
UUID v4: مبتنی بر اعداد تصادفی، رایجترین نوع، دارای منحصر به فردی و حریم خصوصی بالا.
UUID v7: مبتنی بر زمان میلیثانیهای Unix + عدد تصادفی، به طور طبیعی قابل مرتبسازی است و مشکلات حریم خصوصی v1 را حل میکند.
UUID v5: مبتنی بر فضای نام UUID و نام، محاسبه شده با SHA-1؛ ورودیهای یکسان، خروجی یکسان تولید میکنند.
فرمت استاندارد: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 کاراکتر).
ویژگیها
- پشتیبانی از UUID v1، v4، v5، v7
- تولید انبوه با تعداد سفارشی
- فرمتبندی انعطافپذیر: حروف بزرگ، حذف خط تیره، افزودن آکولاد
- اعتبارسنج داخلی و تشخیص نسخه
- پشتیبانی کامل از بینالمللیسازی و تمهای متعدد
UUID چیست؟
UUID یک شناسه 128 بیتی است که به صورت استاندارد به صورت 36 کاراکتر با خط تیره نمایش داده میشود.
UUID v1: مبتنی بر استامپ زمانی و اطلاعات کارت شبکه، ترتیب زمانی دارد اما ممکن است زمان/موقعیت را آشکار کند.
UUID v4: مبتنی بر اعداد تصادفی، رایجترین نوع، دارای منحصر به فردی و حریم خصوصی بالا.
UUID v7: مبتنی بر زمان میلیثانیهای Unix + عدد تصادفی، به طور طبیعی قابل مرتبسازی است و مشکلات حریم خصوصی v1 را حل میکند.
UUID v5: مبتنی بر فضای نام UUID و نام، محاسبه شده با SHA-1؛ ورودیهای یکسان، خروجی یکسان تولید میکنند.
UUID کاربردهای رایج
- شناسه منحصر به فرد برای رکوردهای پایگاه داده یا منابع
- Trace ID برای لاگها و ردیابی رویدادها
- شناسههای عمومی غیرقابل پیشبینی
- شناسه یکپارچه در رابطهای بین سیستمی
UUID سوالات متداول و اشتباهات رایج
- v1 و حریم خصوصی: v1 ممکن است زمان/موقعیت را آشکار کند؛ برای تمرکز بر حریم خصوصی، از v4 استفاده کنید.
- آیا حروف بزرگ و کوچک معادل هستند؟: در مقایسه، حساسیت به حروف بزرگ/کوچک وجود ندارد.
- خط تیره فقط برای نمایش است؛ مگر محدودیتی وجود داشته باشد، توصیه میشود حفظ شوند.
- فرمت با آکولاد در برخی محیطها پذیرفته شده است (مانند ثبت ویندوز)
- v5 قابل پیشبینی است (فضای نام + نام یکسان => UUID یکسان). مناسب برای سناریوهای تکرارپذیر؛ نامناسب برای سناریوهایی که غیرقابل پیشبینی بودن لازم است.
چگونه از UUID در زبانهای برنامهنویسی استفاده کنیم؟
JavaScript
تولید
// 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 + تصادفی)
// 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
تولید
<?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();
UUID v7 (زمان Unix + تصادفی)
<?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
Python
تولید
import uuid
# v4
uid = uuid.uuid4()
# v1
uid1 = uuid.uuid1()
UUID v7 (زمان Unix + تصادفی)
# 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
تولید
// go get github.com/google/uuid
import "github.com/google/uuid"
id := uuid.New() // v4
id1 := uuid.NewUUID() // v1 (may return error)
UUID v7 (زمان Unix + تصادفی)
// 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
Rust
تولید
// 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
UUID v7 (زمان Unix + تصادفی)
// 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();
Java
تولید
import java.util.UUID;
UUID id = UUID.randomUUID(); // v4
UUID v7 (زمان Unix + تصادفی)
// 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 */ }