Developer Tools

Giải Thích UUID: Khi Nào Nên Dùng và Cách Hoạt Động

Tìm hiểu UUID là gì, sự khác biệt giữa các phiên bản, rủi ro trùng lặp, và cách tạo UUID an toàn cho cơ sở dữ liệu và API.

7 phút đọc

Server room abstract

UUID (Universally Unique Identifier) là một nhãn 128-bit, thường được viết dưới dạng xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Các lập trình viên sử dụng UUID làm khóa chính, correlation ID và token mờ đục vì chúng có thể được tạo ra mà không cần một bộ điều phối trung tâm nhưng vẫn cực kỳ khó xảy ra trùng lặp.

Tại sao không chỉ dùng số nguyên?

Số nguyên tự tăng đơn giản và gọn nhẹ, nhưng chúng lộ thông tin: đối thủ cạnh tranh có thể đoán bạn có bao nhiêu đơn hàng, hoặc thu thập tài nguyên bằng cách duyệt qua các ID. UUID không thể đoán được trong thực tế và an toàn khi xuất hiện trong URL cũng như code phía client.

UUID tự thân không phải là một tính năng bảo mật. Nếu bạn cần phân quyền, vẫn phải thực thi trên phía server.

Các phiên bản UUID phổ biến

Phiên bản Cách tạo Trường hợp sử dụng
v1 Địa chỉ MAC + timestamp Legacy; tránh dùng nếu bạn quan tâm đến quyền riêng tư
v4 Các bit ngẫu nhiên Lựa chọn mặc định cho hệ thống mới
v5 Hash SHA-1 của namespace + tên ID xác định từ đầu vào cố định

Hầu hết các ứng dụng hiện nay sử dụng UUID v4 làm khóa chính. Một số nhóm ưa thích ULID hoặc Snowflake ID cho chuỗi có thể sắp xếp theo thời gian; UUID vẫn là loại được hỗ trợ rộng rãi nhất.

Xác suất trùng lặp

Với v4, khả năng xảy ra trùng lặp cực kỳ thấp cho đến khi bạn tạo hàng tỷ ID mỗi giây. Với các ứng dụng web thông thường, coi việc trùng lặp là không thể xảy ra là hoàn toàn hợp lý—miễn là nguồn ngẫu nhiên của bạn đủ mạnh về mặt mật mã (dùng CSPRNG của hệ điều hành hoặc ngôn ngữ lập trình, không dùng Math.random() cho các ID nhạy cảm về bảo mật).

// Browser: prefer crypto.randomUUID() when available
const id = crypto.randomUUID();
console.log(id); // e.g. 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d

Mẹo thực tế

  • Index trong cơ sở dữ liệu: UUID ngẫu nhiên làm phân mảnh B-tree index nhiều hơn so với ID tuần tự. Hàm gen_random_uuid() của PostgreSQL, UUID v7 (sắp xếp theo thời gian), hoặc các kỹ thuật COMB có thể giúp ích nếu hiệu suất chèn dữ liệu quan trọng ở quy mô lớn.
  • Log và tracing: Sử dụng một UUID cho mỗi request làm correlation ID để bạn có thể grep log xuyên suốt các service.
  • Testing: Tạo UUID mới trong các fixture để các test không phụ thuộc vào giá trị cố định, trừ khi bạn cần khả năng tái tạo (khi đó v5 hoặc generator có seed có thể phù hợp hơn).

Thử ngay trên trình duyệt

Sử dụng UUID Generator miễn phí của chúng tôi để tạo các định danh theo kiểu v4 ngay lập tức—không cần đăng ký, và mọi thứ đều chạy cục bộ trên tab của bạn.

Đối với các tác vụ liên quan, bạn có thể quan tâm đến Hash Generator để tạo checksum và JWT Decoder khi debug các token thường đi kèm với UUID trong API.