Công cụ Tạo UUID
Công cụ chuyên nghiệp để tạo và xác minh UUID, hỗ trợ nhiều phiên bản như UUID v1 (dấu thời gian), v4 (ngẫu nhiên), v5 (dựa trên tên) và v7 (Unix time + ngẫu nhiên). Cung cấp các tùy chọn định dạng linh hoạt bao gồm thiết lập số lượng tạo, tạo hàng loạt, chuyển đổi sang chữ in hoa, loại bỏ dấu gạch ngang và thêm dấu ngoặc nhọn. Tích hợp sẵn trình xác minh UUID và nhận diện phiên bản, kèm theo ví dụ mã nguồn đa ngôn ngữ. Phù hợp cho các trường hợp sử dụng như định danh bản ghi cơ sở dữ liệu, theo dõi nhật ký và giao diện liên hệ thống. Mọi thao tác đều được thực hiện cục bộ, đảm bảo an toàn và quyền riêng tư.
Hướng dẫn sử dụng
Tính năng nổi bật
- Hỗ trợ UUID v1, v4, v5, v7
- Hỗ trợ tạo hàng loạt với số lượng tùy chỉnh
- Định dạng linh hoạt: chữ hoa, loại bỏ dấu gạch nối, thêm ngoặc nhọn
- Bộ xác thực tích hợp và nhận diện phiên bản
- Hỗ trợ quốc tế hóa đầy đủ và nhiều chủ đề
UUID là gì?
UUID là bộ định danh 128 bit, được biểu diễn chuẩn dưới dạng 36 ký tự gồm các dấu gạch nối.
UUID v1: Dựa trên mốc thời gian và thông tin card mạng, có thứ tự thời gian nhưng có thể tiết lộ thời gian/vị trí.
UUID v4: Dựa trên số ngẫu nhiên, phổ biến nhất, đảm bảo tính duy nhất và riêng tư tốt.
UUID v7: Dựa trên thời gian Unix theo miligiây + số ngẫu nhiên, tự nhiên sắp xếp được và tránh vấn đề riêng tư của v1.
UUID v5: Dựa trên không gian tên UUID và tên, tính toán qua SHA-1; đầu vào giống nhau luôn tạo ra kết quả giống nhau.
UUID Ứng dụng phổ biến
- Định danh duy nhất cho bản ghi cơ sở dữ liệu hoặc tài nguyên
- Trace ID dùng để theo dõi nhật ký và sự kiện
- Định danh công khai khó đoán
- Định danh thống nhất trong giao diện giữa các hệ thống
UUID Câu hỏi thường gặp & bẫy cần tránh
- v1 và quyền riêng tư: v1 có thể rò rỉ thời gian/vị trí; nếu quan tâm đến riêng tư, nên dùng v4.
- Chữ hoa/thường có tương đương không: Khi so sánh, không phân biệt chữ hoa/thường.
- Dấu gạch nối chỉ mang tính biểu diễn; trừ khi bị hạn chế, nên giữ lại.
- Định dạng có ngoặc nhọn được chấp nhận trong một số môi trường (ví dụ: Windows Registry).
- v5 có tính xác định (cùng không gian tên + tên => cùng UUID). Phù hợp cho kịch bản lặp lại; không phù hợp khi cần tính không thể dự đoán.
Cách sử dụng UUID trong các ngôn ngữ lập trình
// 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 */ }