UUID là gì?
Một UUID (Định danh duy nhất toàn cầu) là một giá trị 128 bit được biểu diễn dưới dạng chuỗi 36 ký tự như 550e8400-e29b-41d4-a716-446655440000. Định dạng và ngữ nghĩa của các phiên bản được định nghĩa bởi RFC 4122 cho v1 đến v5, và bởi RFC 9562 cho các phiên bản mới hơn v6, v7 và v8. Công cụ này tạo v4 (hoàn toàn ngẫu nhiên), v1 (dấu thời gian cộng với ID nút ngẫu nhiên) và v7 (tiền tố dấu thời gian Unix tính bằng mili giây cộng với hậu tố ngẫu nhiên, có thể sắp xếp theo thời gian tạo) — tất cả ngay trong trình duyệt của bạn, bằng API Web Crypto của nền tảng. Không có dữ liệu nào được gửi tới máy chủ.
Việc tạo UUID hoạt động như thế nào?
Mỗi phiên bản đánh đổi giữa tính tất định, khả năng sắp xếp và entropy theo cách khác nhau. Công cụ chọn thuật toán phù hợp dựa trên lựa chọn của bạn:
- v4 (ngẫu nhiên) gọi hàm
crypto.randomUUID()của trình duyệt; hàm này trả về 122 bit ngẫu nhiên dạng mật mã và 6 bit cố định (phiên bản0100và biến thể10) được đặt ở đúng vị trí. Khả năng trùng lặp gần như không thể — bạn sẽ cần tạo khoảng 2,71 triệu tỷ UUID v4 để gặp một bản trùng duy nhất với xác suất 50%. - v1 (dấu thời gian + nút) đóng gói một dấu thời gian Gregory 60 bit (đơn vị 100 nano-giây kể từ 15-10-1582) vào
time_low/time_mid/time_hi_and_version, đặt nibble phiên bản thành0001, chọn một chuỗi đồng hồ 14 bit với các bit biến thể được đặt và dùng ID nút 48 bit ngẫu nhiên với bit multicast bị buộc bật (RFC 4122 §4.5 cho phép rõ ràng dùng ID nút ngẫu nhiên khi không có MAC phần cứng — bit multicast đánh dấu nó là không phải MAC). - v7 (dấu thời gian có thể sắp xếp), theo RFC 9562 §5.7, đặt một dấu thời gian Unix 48 bit theo big-endian tính bằng mili giây, sau đó là phiên bản 4 bit
0111, rồi 12 bit ngẫu nhiên, kế đến biến thể 2 bit10, rồi thêm 62 bit ngẫu nhiên. Vì dấu thời gian nằm ở các bit có trọng số cao nhất, UUID v7 được sắp xếp theo thứ tự từ điển trùng với thứ tự tạo — một tính chất không có ở bất kỳ phiên bản UUID nào khác nếu không mã hóa thêm. - Toàn bộ tính ngẫu nhiên đến từ
crypto.getRandomValues(), RNG an toàn về mặt mật mã của trình duyệt. Cả v1 và v7 đều có cơ chế bảo vệ tính đơn điệu trong cùng một tick để hai lần gọi liên tiếp trong cùng một tick đồng hồ vẫn xếp lần thứ hai trên lần thứ nhất — điều này quan trọng cho các đợt tạo hàng loạt nhanh hơn đồng hồ mili giây. - Pipeline định dạng chạy sau khi tạo. Bạn có thể bỏ dấu gạch nối, chuyển sang chữ hoa, bao giá trị trong dấu ngoặc nhọn (
{…}— quy ước GUID của Microsoft), hoặc kết xuất 16 byte thô dưới dạng base64 (đầu ra 22 ký tự, không padding). Chế độ base64 đè lên các tùy chọn định dạng khác vì base64 đã là một biểu diễn riêng.
Tại sao nên dùng bộ tạo UUID này?
- Không có gì rời khỏi trình duyệt của bạn. Web Crypto API chạy cục bộ; sau khi tải tài liệu ban đầu, trang không thực hiện bất kỳ yêu cầu mạng nào. Mở DevTools, nhấn Tạo và bảng Network sẽ vẫn yên lặng.
- Đầu ra tuân thủ RFC. v4 tuân theo RFC 4122 §4.4, v1 tuân theo §4.2 và §4.5, v7 tuân theo RFC 9562 §5.7. Nibble phiên bản và các bit biến thể được đặt đúng nơi tiêu chuẩn quy định — mọi UUID đều vượt qua biểu thức chính quy chuẩn của phiên bản tương ứng.
- v7 có thể sắp xếp cho khóa cơ sở dữ liệu. Một UUID v7 dùng làm khóa chính clustered trong Postgres, MySQL hoặc SQL Server giúp các thao tác chèn chỉ thêm vào cuối chỉ mục — không tách trang, không I/O ngẫu nhiên — mà vẫn duy trì tính duy nhất toàn cầu. v4 không thể làm điều này vì các bit của nó là ngẫu nhiên.
- Tạo hàng loạt không giới hạn tốc độ. Tạo 1, 10, 100 hoặc 1.000 UUID một lần. Không hạn ngạch, không đăng ký — công cụ chạy trong tab của bạn, nên trần là CPU của bạn, không phải gói API của một nhà cung cấp.
Các ứng dụng phổ biến của UUID là gì?
UUID xuất hiện ở mọi nơi một hệ thống cần một định danh duy nhất toàn cầu mà không cần phối hợp với một cơ quan trung ương:
- Khóa chính cơ sở dữ liệu. Số nguyên tự tăng làm lộ số dòng và phá vỡ sharding. UUID ổn định giữa các shard, an toàn để hợp nhất giữa các vùng và (với v7) giữ cho các thao tác chèn B-tree luôn ở vùng nóng mà không bị tách trang. Một ứng dụng điển hình tạo UUID ở phía client, gửi nó trong câu lệnh INSERT và không bao giờ phải gọi máy chủ chỉ để xin khóa.
- ID tương quan request. Middleware HTTP gắn một UUID v4 cho mỗi yêu cầu đến, ghi log nó ở mọi span và chuyển tiếp xuống hạ tầng phía sau (thường ở header
X-Request-Id). Khi khách hàng báo lỗi, kỹ sư hỗ trợ dán ID và toàn bộ dấu vết request — xuyên qua dịch vụ và múi giờ — hiện ra rõ ràng, không nhập nhằng. - Khóa idempotency. Các API thanh toán (Stripe, Adyen, Square) chấp nhận header
Idempotency-Keyđể một yêu cầu thử lại không bao giờ tính phí khách hàng hai lần. Một UUID do client tạo đảm bảo khóa là duy nhất cho mỗi thao tác logic, đúng như hợp đồng các API này yêu cầu.
Ví dụ về UUID trông như thế nào?
Trong Node.js hoặc một trình duyệt hiện đại, một dòng crypto.randomUUID() trả về một UUID v4 mới — ví dụ 3f50b5a8-2c54-4b9c-9c1f-3e5c7e2b8d12. Dùng nó làm ID request hoặc khóa idempotency. Khi UUID sẽ được đưa vào một cột cơ sở dữ liệu là khóa chính clustered, hãy tạo v7 thay vào đó: hai giá trị v7 được tạo cách nhau một mili giây, ví dụ 0190a3b0-7d4f-7c9e-8b21-a4d6f0bd9c11 và 0190a3b0-7d50-7f15-9c4e-72b3e0c1d8a4, sắp xếp theo thứ tự từ điển trùng thứ tự tạo. Kiểu uuid của Postgres lưu trữ hai phiên bản giống hệt nhau — khác biệt xuất hiện ở thời điểm ghi chỉ mục: v7 nối vào bên phải B-tree, còn v4 phân tán các thao tác chèn và buộc I/O ngẫu nhiên.
Trình tạo UUID này chỉ làm một việc: biến một cú nhấp chuột thành một hoặc nhiều định danh tuân thủ RFC, được định dạng theo cách bạn cần, mà không gửi yêu cầu của bạn tới bất kỳ máy chủ nào. Chọn phiên bản, chọn số lượng, chọn định dạng — tạo, sao chép và tiếp tục công việc.