Trong thế giới lập trình, việc tạo một mã định danh duy nhất (Unique Identifier) là nhu cầu cơ bản nhưng quan trọng — đặc biệt khi ứng dụng phát triển theo hướng phân tán (distributed), microservices, hoặc chạy trên cloud.
Và đó chính là lý do UUID (Universally Unique Identifier) ra đời.
UUID giúp chúng ta gắn cho mỗi bản ghi, người dùng, hoặc tệp dữ liệu một “căn cước” duy nhất trên toàn cầu - mà không cần hỏi ai khác.
UUID là gì?
UUID (Universally Unique Identifier) là một chuỗi 128-bit được biểu diễn dưới dạng 36 ký tự (bao gồm cả dấu gạch ngang), ví dụ:
550e8400-e29b-41d4-a716-446655440000
UUID còn có tên gọi khác là GUID (Globally Unique Identifier) — thường dùng trong hệ sinh thái Microsoft.
UUID giúp:
-
Đảm bảo tính duy nhất trên toàn cầu
-
Hoạt động ngoài database trung tâm
-
Dễ phân tán giữa nhiều máy chủ
-
Không tiết lộ số lượng record (như ID tăng dần)
Cấu trúc của UUID
Một UUID có cấu trúc như sau:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
Phần |
Mô tả |
---|---|
M |
Chỉ định phiên bản (version) UUID |
N |
Chỉ định variant bits |
Các phần còn lại |
Dữ liệu (timestamp, random, namespace, MAC,…) |
Sơ đồ minh hoạ cấu trúc UUID
┌──────────┬──────┬──────┬──────┬────────────┐ │ time_low │ time_mid │ version │ variant │ node │ └──────────┴──────┴──────┴──────┴────────────┘
Các phiên bản của UUID
Hiện nay, có 7 phiên bản (version) chính của UUID, được định nghĩa trong RFC 4122:
Version |
Thuật toán |
Mô tả |
---|---|---|
v1 |
Timestamp + MAC |
Dựa trên thời gian & địa chỉ mạng |
v2 |
DCE Security |
Hiếm dùng |
v3 |
MD5 (namespace + name) |
Hash từ tên định danh |
v4 |
Random |
Sinh ngẫu nhiên hoàn toàn |
v5 |
SHA-1 (namespace + name) |
Giống v3 nhưng bảo mật hơn |
v6 |
Time-ordered |
Giữ thứ tự thời gian |
v7 |
Time + Random |
Cải tiến hiện đại, hiệu năng cao |
Hiện tại, v4 và v7 là hai phiên bản phổ biến nhất trong lập trình web.
UUID v1 — Dựa trên thời gian và địa chỉ MAC
Phiên bản 1 tạo UUID bằng cách kết hợp:
-
Dấu thời gian (timestamp)
-
Clock sequence
-
Địa chỉ MAC của thiết bị
Ưu điểm:
-
Có thể sắp xếp theo thời gian
-
Đảm bảo duy nhất theo máy
Nhược điểm:
-
Có thể lộ địa chỉ MAC
-
Dễ đoán được UUID tiếp theo nếu biết cấu trúc
Ví dụ Node.js:
import { v1 as uuidv1 } from 'uuid'; console.log(uuidv1());
Kết quả:
f64a8b8c-8c1a-11ee-b6c3-7b7a8dc4e4c4
UUID v4 — Dựa trên random
Phiên bản 4 là ngẫu nhiên hoàn toàn, dùng thuật toán sinh số giả ngẫu nhiên (RNG).
Ưu điểm:
-
Không thể đoán được
-
Không phụ thuộc vào thời gian hay thiết bị
Nhược điểm:
-
Không thể sắp xếp theo thời gian
-
Kích thước index lớn → chậm hơn nếu dùng trong DB
Ví dụ Node.js:
import { v4 as uuidv4 } from 'uuid'; console.log(uuidv4());
Kết quả:
c9b1a9e7-6cbf-4c7f-b7cc-9c71a73d55e2
UUID v7 — Phiên bản hiện đại cho thế hệ mới
Được đề xuất gần đây (2022), UUID v7 kết hợp timestamp + random bits, giúp:
-
Sắp xếp được theo thời gian
-
Hiệu quả hơn trong indexing
-
Bảo mật hơn v1, vì không chứa MAC address
UUID v7 đặc biệt phù hợp cho:
-
Hệ thống microservices
-
Database lớn (PostgreSQL, MySQL, MongoDB)
-
ORM hiện đại (Prisma, Drizzle, Sequelize)
Ví dụ Node.js:
import { v7 as uuidv7 } from 'uuid'; console.log(uuidv7());
Kết quả:
018f7c4d-4d23-7c7e-b1f3-1cb3436c839a
Xác suất trùng UUID
UUID v4 có 122 bit dữ liệu (sau khi trừ bit version & variant).
Tổng số UUID có thể tạo: 2¹²² ≈ 5.3 × 10³⁶
Nếu bạn tạo 1 tỉ UUID mỗi giây, thì: Sẽ mất hơn 100 năm để đạt 50% xác suất trùng.
Nói cách khác: trùng UUID gần như bất khả thi trong thực tế.
So sánh UUID và Auto Increment ID
Tiêu chí |
UUID |
Auto Increment |
---|---|---|
Tính duy nhất toàn cầu |
Có |
Không |
Cần database trung tâm |
Không |
Có |
Hiệu năng index |
Chậm hơn |
Nhanh hơn |
Độ dài |
36 ký tự |
4–8 byte |
Khả năng sắp xếp |
v1/v7 có |
Có |
Bảo mật (ẩn số lượng record) |
Có |
Không |
UUID không thay thế hoàn toàn auto increment — mà phù hợp với các hệ thống phân tán hoặc cloud-native.
Khi nào nên dùng UUID?
Nên dùng khi:
-
Hệ thống phân tán hoặc nhiều service độc lập
-
Cần tạo ID trực tiếp từ client
-
Cần ẩn logic nội bộ (tránh lộ số lượng bản ghi)
-
Cần kết hợp dữ liệu từ nhiều nguồn
Không nên dùng khi:
-
Ứng dụng đơn giản, chỉ 1 DB
-
Cần tối ưu tốc độ ghi/đọc index
-
Dung lượng lưu trữ hạn chế
Một số biến thể khác của UUID
Ngoài UUID theo RFC, còn có các biến thể hiệu quả và dễ đọc hơn:
ULID (Universally Lexicographically Sortable Identifier)
-
Có thể sắp xếp theo thời gian
-
Dễ đọc, ngắn hơn UUID
-
Thân thiện với URL
01H8ZGVNMBJ8M2B6VQ8H4QTPHB
CUID
-
Dành cho frontend hoặc môi trường không ổn định
-
Ngắn gọn, không xung đột với các lib khác
clxczwxts0000n0ad2pqu1r1f
UUID trong các ngôn ngữ lập trình
Node.js
import { v4 as uuidv4 } from 'uuid'; console.log(uuidv4());
Python
import uuid print(uuid.uuid4())
Go
import "github.com/google/uuid" id := uuid.New() fmt.Println(id.String())
UUID v7 – tiêu chuẩn mới của tương lai
Nhiều nền tảng hiện đại đã chuyển sang UUID v7:
-
Prisma ORM (2024+)
-
PlanetScale / MySQL 8.0
-
PostgreSQL 17
-
Rust & Go libraries mới
UUID v7 vừa đảm bảo duy nhất toàn cầu, vừa sắp xếp được theo thời gian, giúp tối ưu query và index.
Kết luận
UUID không chỉ là một chuỗi ngẫu nhiên — mà là một thuật toán có chủ đích, cân bằng giữa:
-
Tính duy nhất
-
Bảo mật
-
Khả năng phân tán
Nếu bạn đang xây dựng hệ thống phân tán, microservices, hoặc ứng dụng có client tự sinh ID — hãy chọn UUID v7.
Còn nếu bạn cần đơn giản, nhẹ, tối ưu index trong database, auto increment vẫn là lựa chọn phù hợp.