UUID là gì? Giải thích format 8-4-4-4-12 và cách đọc từng nhóm

(Cập nhật: 19 tháng 7, 2026 ) UUID format 8-4-4-4-12 GUID primary key RFC 4122
Kết luận

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ómSố ký tự hexVai trò thường gặp
18Phần ngẫu nhiên / time_low (tùy version)
24Tiếp tục payload
34M = version (nibble cao)
44N = variant (2–3 bit cao)
512Phầ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 4version 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
1Time-based (v1)
3Name-based MD5
4Random — phổ biến nhất hiện nay
5Name-based SHA-1
7Time-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

UUID vs serial vs ULID
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:

  1. Đúng 4 dấu -
  2. Độ dài nhóm 8-4-4-4-12
  3. Nhóm 3 bắt đầu bằng 4 nếu claim là v4
  4. Nhóm 4 bắt đầu bằng 8|9|a|b
  5. 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ỗiTriệu chứngCách tránh
Bỏ hết hyphenThư viện báo invalid; DB rejectGiữ 36 ký tự canonical
slice(0, 8) làm public id”Trùng” sau vài thángBảng map slug riêng
Math.random() tự ghépKhông đủ entropy / sai version bitscrypto.randomUUID()
Dán UUID có { } kiểu GUID cũFail regexStrip ngoặc trước validate
Nhầm 32 hex không hyphen với MD5Validate “qua” nhưng không phải UUIDKiể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

Số lượng
Kết quả

Cách dùng tool Kawa trong 30 giây

  1. Mở /vi/tools/uuid/
  2. Chọn số lượng nếu cần nhiều id (seed, mock list)
  3. Copy — dán vào Postman, fixture, hoặc migration
  4. Nhìn nhóm 3 có 4 khô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 uuid type? → dùng native, đừng varchar(36) trừ lý do đặc biệt
  • Fixture có hard-code một UUID “đẹp”? → chỉ dùng trong test cô lập

Liên kết liên quan