Tạo định danh ngẫu nhiên — UUID v4, UUID v7 sắp xếp được theo thời gian, ULID, hay Nano ID — với số lượng và định dạng tùy ý, ngay trong trình duyệt.
File không bao giờ rời khỏi thiết bị của bạn
Các tùy chọn định dạng chỉ áp dụng cho UUID, và có hiệu lực từ lần tạo tiếp theo.
Bốn định dạng, một nhiệm vụ: đưa ra một định danh không nơi nào khác đang có. Khác nhau ở thứ tối
ưu thêm — ngẫu nhiên thuần túy, sắp xếp được, hay độ ngắn — và trang này tạo cả bốn, hàng loạt,
không request nào rời trình duyệt.
UUID v4: 122 bit ngẫu nhiên, không gì khác
Một UUID v4 như 0f1a2242-40af-40c7-b17e-386fb1d41e74 dài 128 bit với hai điểm cố định: ký tự ở
vị trí 15 luôn là 4 (phiên bản), ký tự ở vị trí 20 luôn là 8, 9, a hoặc b (biến thể RFC
4122). Mọi bit còn lại ngẫu nhiên — toàn bộ thiết kế chỉ có vậy, không cấu trúc để khai thác, không
quan hệ gì giữa hai id cách nhau một giây.
UUID v7 và ULID: định danh sắp xếp theo thời điểm tạo
Tạo liên tiếp hai UUID v7 — 019fccdd-3d93-7000-a933-9e25978bfe16 và
019fccdd-3d93-7001-97c9-7817dd6a1084 — thì 12 ký tự hex đầu giống hệt nhau: dấu thời gian Unix 48
bit theo mili-giây, chung cho cả hai vì cùng tạo trong một mili-giây. Đọc 019fccdd3d93 dưới dạng
hex ra 1785848479123, tức 2026-08-04T13:01:19.123Z — thời điểm tạo nằm ngay trong id. Chữ 7
ngay sau đó là nibble phiên bản cố định, không thuộc dữ liệu — ba chữ số tiếp theo, 000 với
001, mới là bộ đếm 12 bit phá thế hòa giữa các id chung mili-giây, giữ cặp id đúng thứ tự tạo;
byte còn lại là 62 bit ngẫu nhiên.
ULID đạt kết quả tương tự theo cách khác: 01KZ6DTFCKZHEZM2VSK1ZVTDFA tách thành 10 ký tự dấu thời
gian, 01KZ6DTFCK, và 16 ký tự ngẫu nhiên, ZHEZM2VSK1ZVTDFA — 80 bit ngẫu nhiên, viết bằng
Crockford base32 thay vì hex. Bảng chữ Crockford bỏ I, L, O — dễ đọc nhầm thành 1 hay 0 —
và bỏ riêng U để giảm khả năng đánh vần thành một từ tục.
Mẹo:Dùng id làm khóa chính? Định dạng sắp xếp theo thời gian như UUID v7 hay ULID luôn chèn vào cuối chỉ mục B-tree, đúng kiểu truy cập một số nguyên tự tăng vẫn có — còn khóa UUID v4 ngẫu nhiên chèn vào giữa, buộc database phải tách trang chỉ mục khắp nơi thay vì chỉ nối thêm vào cuối.
Nano ID: ngắn, ngẫu nhiên, an toàn cho URL
CNBRohZ0f_k_I54PwLe9A là một Nano ID ở độ dài mặc định: 21 ký tự, lấy từ bảng 64 ký tự an toàn để
nhét thẳng vào path URL, không cần mã hóa thêm. Mỗi ký tự là một lượt chọn công bằng 1-trên-64, nên
21 ký tự cho 126 bit ngẫu nhiên — nhiều hơn 122 bit của UUID v4 — trong chuỗi ngắn hơn 36 ký tự của
UUID khoảng 40%. Nó không mang dấu thời gian, không liên quan thứ tự sắp xếp; tồn tại chỉ để ngắn,
duy nhất, dán thẳng vào một đường link.
Mẹo:Cần độ dài khác 21 ký tự, cho khớp một hệ thống khác hay để tăng thêm an toàn? Độ dài Nano ID chỉnh được từ 4 tới 64 ký tự — rút ngắn cho một link chia sẻ, hay kéo dài hơn 21 khi biên độ chống trùng quan trọng hơn độ ngắn gọn.
Bốn định dạng, đặt cạnh nhau
Định dạng
Độ dài
Sắp xếp theo thời gian
Độ ngẫu nhiên
Phù hợp mặc định cho
UUID v4
36 ký tự
không
122 bit
Định danh tổng quát, dễ nhận diện nhất
UUID v7
36 ký tự
có, tới mili-giây
62 bit + bộ đếm 12 bit
Khóa chính hay chỉ mục cần chèn nối tiếp vào cuối
ULID
26 ký tự
có, tới mili-giây
80 bit
Như UUID v7, ngắn hơn và dễ đọc to hơn
Nano ID
21 ký tự (tùy chỉnh)
không
126 bit mặc định
Token ngắn hay slug URL, không phải khóa database
Vì sao thứ tự chèn ảnh hưởng tới hiệu năng chỉ mục
Đa số database giữ chỉ mục khóa chính dạng B-tree, sắp theo đúng thứ tự giá trị khóa. Đưa vào đó
id chỉ tăng dần — số tự tăng, UUID v7, hay ULID — mỗi lần chèn rơi đúng vào cuối, chỗ rẻ nhất để
thêm dòng. Đưa UUID v4 vào thay thế, mỗi lần chèn rơi vào một điểm ngẫu nhiên giữa chừng, buộc
database tách và cân bằng lại những trang lẽ ra không phải động tới — id nào cũng định danh đúng
dòng, chỉ chi phí ghi chỉ mục khác nhau.
Câu hỏi thường gặp
Nên dùng loại nào theo mặc định?
Tạo uuid v4 nếu không có lý do đặc biệt nào khác — đây là định dạng được nhận diện rộng rãi nhất, ngôn ngữ nào và database nào cũng có kiểu dữ liệu riêng cho nó, không cần giải thích gì thêm với người đọc schema sau này. Chỉ chọn UUID v7 hay ULID khi id đó sẽ làm khóa chính hay chỉ mục, nơi thứ tự chèn dữ liệu thật sự ảnh hưởng tới hiệu năng.
UUID v7 là gì, và vì sao nó sắp xếp được theo thời gian còn v4 thì không?
UUID v4 là 122 bit ngẫu nhiên hoàn toàn, không có cấu trúc gì để khai thác, nên hai id v4 tạo cách nhau một giây không có xu hướng đứng gần nhau khi sắp xếp — vì chúng ngẫu nhiên thật sự. UUID v7 thay 48 bit đầu bằng dấu thời gian Unix theo mili-giây, nên id tạo sau luôn có phần đầu lớn hơn về số, đúng thứ mà phép so sánh chuỗi hay số đều xét trước tiên.
ULID là gì, khác UUID v7 ở chỗ nào?
ULID giải cùng bài toán — định danh sắp xếp được theo thời điểm tạo — bằng hình dạng khác: 26 ký tự Crockford base32 thay vì 32 chữ số hex cộng 4 dấu gạch nối của UUID, tổng cộng 36 ký tự. Trong 26 ký tự đó, 10 là dấu thời gian, 16 còn lại là ngẫu nhiên. Khác biệt thực tế chủ yếu ở hình thức: ULID ngắn hơn, và bảng ký tự của nó bỏ hẳn chữ I, L, O và U — I, L, O vì dễ đọc nhầm thành số 1 hay số 0 khi đọc to hay chép tay, còn U bị bỏ riêng để giảm khả năng id vô tình đánh vần thành một từ tục.
Nano ID có an toàn như UUID không?
Về khả năng chống trùng thì có — Nano ID mặc định lấy 21 ký tự từ bảng 64 ký tự, mỗi ký tự là một lượt chọn công bằng 1-trên-64, tính ra 126 bit ngẫu nhiên, còn nhiều hơn 122 bit của UUID v4. Điều nó không có là cấu trúc nhị phân chuẩn như UUID, và hoàn toàn không mang thông tin thời gian, nên hãy chọn nó khi cần một token ngắn, an toàn để nhét vào URL, chứ không phải một khóa database.
Có tạo UUID viết hoa, bỏ gạch nối, hay bọc ngoặc nhọn được không?
Được, cho UUID v4 và UUID v7 — ba công tắc định dạng viết hoa chữ, bỏ dấu gạch nối, hoặc bọc kết quả trong dấu ngoặc nhọn, khớp với cách một số driver hay hệ thống cũ mong đợi một literal UUID trông ra sao. Chúng bị vô hiệu với ULID và Nano ID, vì áp định dạng của UUID lên hai loại đó sẽ phá hỏng bảng ký tự riêng của chúng.
Việc tạo id này chạy trong trình duyệt hay trên server?
Hoàn toàn trong trình duyệt của bạn. Mỗi id được dựng từ bộ sinh số ngẫu nhiên mật mã học của thiết bị, ngay trong JavaScript, và không gì về yêu cầu đó — loại id, số lượng, hay chính các id — được gửi đi đâu cả. Điều này quan trọng nếu bạn đang tạo trước các khóa cho một hệ thống chưa triển khai và không muốn bên thứ ba thấy chúng.
Một lượt tạo được tối đa bao nhiêu id?
Tối đa 1.000 id một lượt. Giới hạn này tồn tại vì mỗi id trong một lượt được vẽ vào một ô kết quả, và tab trình duyệt bắt đầu ì ạch với chừng đó văn bản còn trước cả khi bộ nhớ máy bạn kịp là vấn đề — đây là giới hạn giao diện, không phải giới hạn của bộ sinh id.