UUID là gì? Giải thích format 8-4-4-4-12 và cách đọc từng nhóm
UUID là định danh 128 bit, thường viết 8-4-4-4-12 (36 ký tự có hyphen). Nhóm 3 mang version, nhóm 4 mang variant. Với v4, bạn cần CSPRNG — không tự ghép Math.random(). Dùng làm primary key / trace id khi muốn mint phân tán; cần thứ tự thời gian thì xem ULID/v7. Sinh mẫu chuẩn trên tạo UUID Kawa rồi đối chiếu format trước khi nhét vào JSON test.
Sinh viên năm 3 vừa nghe “dùng UUID cho id” — mở Stack Overflow thấy chuỗi lạ có nhiều dấu -. Fresher outsourcing nhận task “validate UUID trên form” mà chưa biết đếm nhóm. Bài này chỉ tập trung format và cách đọc, không đi sâu xác suất collision (đã có bài riêng).
Bài viết này giúp bạn
- Hiểu UUID là gì trong một đoạn
- Đọc đúng 8-4-4-4-12 và từng bit đặc biệt
- Phân biệt version / variant trên chuỗi thật
- Tránh lỗi thường gặp: thiếu hyphen, uppercase lẫn lộn, cắt ngắn
- Biết khi nào UUID phù hợp vs serial / ULID
UUID là gì (định nghĩa ngắn)
UUID (Universally Unique Identifier) là giá trị 128 bit dùng làm định danh. Mục tiêu thiết kế: hai máy không nói chuyện với nhau vẫn có thể tự sinh id mà gần như không trùng.
Không phải “magic string chống hack”. Không thay password. Không chứng minh quyền sở hữu. Nó chỉ là nhãn duy nhất — giống biển số xe toàn cầu hơn là khóa mật mã.
Tên gọi gần: GUID (thường trong tài liệu Microsoft). Trên wire/API, bạn gần như luôn thấy cùng kiểu chuỗi hex.
Format chuẩn: 8-4-4-4-12
RFC 4122 (và bản cập nhật liên quan) mô tả dạng chữ phổ biến:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
\______/ \__/ \__/ \__/ \__________/
8 4 4 4 12
| Nhóm | Số ký tự hex | Vai trò thường gặp |
|---|---|---|
| 1 | 8 | Phần ngẫu nhiên / time_low (tùy version) |
| 2 | 4 | Tiếp tục payload |
| 3 | 4 | M = version (nibble cao) |
| 4 | 4 | N = variant (2–3 bit cao) |
| 5 | 12 | Phần còn lại của 128 bit |
Tổng: 32 chữ hex + 4 dấu - = 36 ký tự.
Ví dụ kinh điển (minh họa format, đừng dùng làm secret):
550e8400-e29b-41d4-a716-446655440000
Đếm nhanh:
550e8400 e29b 41d4 a716 446655440000
8 4 4 4 12
Nhóm 3 là 41d4 → nibble đầu 4 → version 4. Nhóm 4 a716 → bắt đầu a → variant RFC hợp lệ (8|9|a|b).
Version và variant: hai nibble cần nhớ
Version (nhóm 3)
| Giá trị M | Ý nghĩa phổ biến |
|---|---|
| 1 | Time-based (v1) |
| 3 | Name-based MD5 |
| 4 | Random — phổ biến nhất hiện nay |
| 5 | Name-based SHA-1 |
| 7 | Time-ordered (xu hướng mới cho DB) |
Công cụ và hầu hết template test data dùng v4.
Variant (nhóm 4)
Với variant RFC 4122, hai bit đầu của octet đầu nhóm 4 là 10. Trên chuỗi hex, ký tự đầu nhóm 4 thường là 8, 9, a, hoặc b.
Nếu bạn thấy c, d, e, f ở đó, đó có thể là variant khác hoặc chuỗi tự chế — đừng gọi là “UUID chuẩn” khi validate nghiêm.
So sánh nhanh với các loại id khác
| Loại | Dạng thường thấy | Khi nào hợp |
|---|---|---|
| UUID v4 | 8-4-4-4-12 ngẫu nhiên | Mint phân tán, không lộ số lượng bản ghi |
| Serial / bigserial | 1, 2, 3… | DB đơn, cần id ngắn, chấp nhận đoán được thứ tự |
| ULID / UUID v7 | Sort được theo thời gian | Muốn unique + locality insert / sort theo created |
| NanoID ngắn | 21 ký tự URL-friendly | Public slug; không gian nhỏ hơn — đừng nhầm với UUID |
UUID dài hơn serial — URL xấu hơn một chút, index random có thể phân mảnh hơn. Đổi lại: không cần sequence trung tâm khi nhiều service cùng tạo bản ghi.
Ví dụ dùng đúng trong JSON / SQL
Mock API
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"orderCode": "DH-2026-001",
"status": "pending"
}
id là UUID; orderCode là mã nghiệp vụ dễ đọc — hai khái niệm khác nhau. Đừng cắt UUID để làm mã đơn hàng đẹp.
Postgres
CREATE TABLE users (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
email text UNIQUE NOT NULL
);
Kiểu uuid lưu binary 16 byte; khi SELECT thường hiện lại dạng 8-4-4-4-12.
JavaScript
const id = crypto.randomUUID();
// "3f1a0c2e-9b44-4d2a-a8e1-0c1f6b7d2a91" — luôn đủ hyphen
Validate format (thực dụng)
Regex đủ dùng cho v4 (không thay thư viện parse khi security-critical):
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
Checklist mắt thường trước khi merge fixture:
- Đúng 4 dấu
- - Độ dài nhóm 8-4-4-4-12
- Nhóm 3 bắt đầu bằng
4nếu claim là v4 - Nhóm 4 bắt đầu bằng
8|9|a|b - Không có khoảng trắng / dấu ngoặc nhầm từ copy Word
Uppercase A-F thường chấp nhận được (case-insensitive). Team nên thống nhất lowercase khi serialize JSON để diff sạch.
Lỗi format hay gặp (và triệu chứng)
| Lỗi | Triệu chứng | Cách tránh |
|---|---|---|
| Bỏ hết hyphen | Thư viện báo invalid; DB reject | Giữ 36 ký tự canonical |
slice(0, 8) làm public id | ”Trùng” sau vài tháng | Bảng map slug riêng |
Math.random() tự ghép | Không đủ entropy / sai version bits | crypto.randomUUID() |
Dán UUID có { } kiểu GUID cũ | Fail regex | Strip ngoặc trước validate |
| Nhầm 32 hex không hyphen với MD5 | Validate “qua” nhưng không phải UUID | Kiểm tra version nibble |
Case: form đăng ký upload file đặt tên bằng UUID
Team freelance làm portal nộp bài cho trường: tên file gốc tiếng Việt dễ trùng và lỗi encoding trên server cũ. Họ đổi sang:
{uuid}.pdf
Ví dụ: a3f2c1b0-12ab-4cde-9f01-23456789abcd.pdf
Ưu: không đụng tên, không lộ tên học viên trên URL thô.
Lưu ý: vẫn cần ACL — UUID không phải secret tuyệt đối nếu URL bị leak. Kết hợp auth + UUID là đủ cho hầu hết bài tập / MVP.
Sinh nhanh vài tên file thử trên công cụ UUID trước khi viết script rename.
🆔 Tạo UUID ngay tại đây
Cách dùng tool Kawa trong 30 giây
- Mở /vi/tools/uuid/
- Chọn số lượng nếu cần nhiều id (seed, mock list)
- Copy — dán vào Postman, fixture, hoặc migration
- Nhìn nhóm 3 có
4không
Chạy trên trình duyệt, không gửi dữ liệu lên server lạ — phù hợp khi bạn chỉ cần id test và đang mở Wi-Fi công cộng.
Checklist chọn UUID cho dự án mới
- Cần mint id từ nhiều service / client offline? → nghiêng UUID
- URL public cần ngắn & đẹp? → đừng dùng raw UUID; thêm slug
- Báo cáo sort theo id ≈ sort theo thời gian? → ULID / v7
- Team quen Postgres
uuidtype? → dùng native, đừngvarchar(36)trừ lý do đặc biệt - Fixture có hard-code một UUID “đẹp”? → chỉ dùng trong test cô lập