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, v4v7 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

Không

Cần database trung tâm

Không

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ó

Bảo mật (ẩn số lượng record)

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.