Công cụ Tạo UUID

Tạo và xác thực UUID (v1, v4, v5, v7), hỗ trợ tạo hàng loạt và nhiều tùy chọn định dạng, kèm ví dụ mã đa ngôn ngữ.

Bộ tạo UUID

Tùy chọn định dạng

Bộ xác thực UUID

Hướng dẫn sử dụng

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.
Định dạng chuẩn: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 ký tự).

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 Ví dụ nhanh

Định dạng chuẩn:
550e8400-e29b-41d4-a716-446655440000
Định dạng chữ hoa:
550E8400-E29B-41D4-A716-446655440000
Không có dấu gạch nối:
550e8400e29b41d4a716446655440000
Có dấu ngoặc nhọn:
{550e8400-e29b-41d4-a716-446655440000}

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

JavaScript
Tạo
// 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 (thời gian Unix + ngẫu nhiên)
// 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();
Xác thực
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
Tạo
<?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 (thời gian Unix + ngẫu nhiên)
<?php
// composer require ramsey/uuid:^4.7
use Ramsey\Uuid\Uuid;

$uuid7 = Uuid::uuid7();
Xác thực
<?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
Tạo
import uuid
# v4
uid = uuid.uuid4()
# v1
uid1 = uuid.uuid1()
UUID v7 (thời gian Unix + ngẫu nhiên)
# pip install uuid6
from uuid6 import uuid7

uid7 = uuid7()
Xác thực
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
Tạo
// go get github.com/google/uuid
import "github.com/google/uuid"

id := uuid.New()     // v4
id1 := uuid.NewUUID() // v1 (may return error)
UUID v7 (thời gian Unix + ngẫu nhiên)
// go get github.com/gofrs/uuid/v5
import (
  uuid "github.com/gofrs/uuid/v5"
)

id7, err := uuid.NewV7()
Xác thực
import "github.com/google/uuid"
_, err := uuid.Parse(id.String()) // err == nil means valid
Rust
Tạo
// 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 (thời gian Unix + ngẫu nhiên)
// Cargo.toml: uuid = { version = "1", features = ["v7"] }
use uuid::Uuid;

let v7 = Uuid::now_v7();
Xác thực
use uuid::Uuid;
let ok = Uuid::parse_str(v4.to_string().as_str()).is_ok();
Java
Tạo
import java.util.UUID;

UUID id = UUID.randomUUID(); // v4
UUID v7 (thời gian Unix + ngẫu nhiên)
// Maven: com.github.f4b6a3:uuid-creator
import com.github.f4b6a3.uuid.UuidCreator;

UUID v7 = UuidCreator.getTimeOrderedEpoch(); // UUIDv7
Xác thực
import java.util.UUID;

try { UUID.fromString(id.toString()); /* valid */ } catch (IllegalArgumentException ex) { /* invalid */ }