Trình Tạo KSUID - Tạo Định Danh Duy Nhất Có Thể Sắp Xếp
Tạo Định Danh Duy Nhất K-Sortable (KSUIDs) trực tuyến. Tạo ngay các ID có thể sắp xếp theo thời gian, chống xung đột cho các hệ thống phân tán và cơ sở dữ liệu.
Trình tạo KSUID
Tài liệu hướng dẫn
Trình tạo KSUID
KSUID (Mã định danh duy nhất có thể sắp xếp theo K, K-Sortable Unique Identifier) là mã gồm 27 ký tự, dùng để gắn nhãn cho các bản ghi như hàng trong cơ sở dữ liệu, mục nhật ký hoặc yêu cầu API. Mã này kết hợp dấu thời gian với dữ liệu ngẫu nhiên, vì vậy các ID được tạo sau luôn được sắp xếp sau các ID được tạo trước, dù mỗi mã trên thực tế vẫn là duy nhất. Công cụ này tạo một KSUID duy nhất trong trình duyệt và cho phép người dùng sao chép mã.
KSUID được cấu tạo như thế nào?
KSUID có độ dài 20 byte, được chia thành hai phần:
- Dấu thời gian (4 byte): số giây kể từ một thời điểm bắt đầu cố định gọi là kỷ nguyên KSUID.
- Dữ liệu ngẫu nhiên (16 byte): dữ liệu do bộ sinh số ngẫu nhiên mật mã của trình duyệt tạo ra.
Sau đó, 20 byte này được chuyển thành văn bản bằng mã hóa base62, một hệ thống biểu diễn số bằng 62 ký tự: các chữ số 0-9, chữ cái viết hoa A-Z và chữ cái viết thường a-z. Kết quả luôn được đệm để có chính xác 27 ký tự, chẳng hạn như 0qjBBlJIfbVLKwnJn4xpLGDr00e.
Vì dấu thời gian đứng trước, hai KSUID được tạo cách nhau một giây thường sẽ được sắp xếp theo cùng thứ tự với thời điểm tạo khi so sánh dưới dạng văn bản thuần túy. Vì 16 byte cuối là ngẫu nhiên, hai KSUID được tạo trong cùng một giây gần như chắc chắn vẫn khác nhau.
Kỷ nguyên KSUID
Hầu hết hệ thống máy tính đếm thời gian theo giây kể từ 1 tháng 1, 1970 (gọi là "kỷ nguyên Unix"). KSUID sử dụng một thời điểm bắt đầu khác, tức kỷ nguyên KSUID: 1.400.000.000 giây sau kỷ nguyên Unix, tương ứng với 13 tháng 5, 2014, 16:53:20 UTC.
Việc sử dụng thời điểm bắt đầu muộn hơn giúp trường dấu thời gian dài 4 byte bao quát được nhiều năm hữu ích hơn trước khi hết dung lượng. Bộ đếm 4 byte (32 bit) có thể chứa tối đa 4.294.967.295 giây. Tính từ kỷ nguyên KSUID, khoảng thời gian đó kết thúc vào khoảng 19 tháng 6, 2150.
Công thức KSUID
Chuỗi KSUID được tạo qua ba bước.
-
Tìm giá trị dấu thời gian:
T = floor(current_unix_time_in_seconds) − 1,400,000,000 -
Tạo 16 byte ngẫu nhiên,
R, bằng bộ sinh số ngẫu nhiên mật mã an toàn. -
Ghép dấu thời gian dài 4 byte với 16 byte ngẫu nhiên thành một khối 20 byte, sau đó mã hóa khối đó bằng base62 và đệm kết quả thành 27 ký tự:
KSUID = Base62( T ‖ R )
Ở đây, ‖ có nghĩa là "đặt nối tiếp nhau". Các byte dấu thời gian luôn đứng trước; chính điều này khiến chuỗi cuối cùng được sắp xếp đúng theo thời gian.
Ví dụ minh họa
Giả sử phần dấu thời gian của một KSUID là 100000000. Vì kỷ nguyên KSUID là 1.400.000.000 giây sau kỷ nguyên Unix, dấu thời gian này tương ứng với 14 tháng 7, 2017, 02:40:00 UTC.
Ghép dấu thời gian đó với chuỗi 16 byte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 (chỉ dùng ở đây để ví dụ có thể tái lập; trình tạo thực tế sử dụng các byte ngẫu nhiên), rồi mã hóa base62 sẽ cho:
0qjBBlJIfbVLKwnJn4xpLGDr00e
Chuỗi đó dài 27 ký tự, chỉ gồm chữ số và chữ cái, nên có thể dùng trực tiếp trong URL hoặc tên tệp.
Cách sử dụng công cụ tạo KSUID
- Mở trang tạo KSUID.
- Chọn nút "Tạo KSUID".
- Công cụ tạo một KSUID mới bằng thời gian hiện tại và các byte ngẫu nhiên mới, rồi hiển thị mã trên trang.
- Chọn nút "Sao chép KSUID" để sao chép giá trị vào bảng nhớ tạm.
- Chọn "Đặt lại" để xóa kết quả. Nút Đặt lại chỉ xuất hiện sau khi một KSUID được tạo.
Mỗi lần nhấp vào "Tạo KSUID" sẽ tạo chính xác một mã định danh. Để tạo nhiều KSUID, hãy nhấp lại vào nút cho từng mã mới; công cụ không có chế độ tạo hàng loạt hoặc chức năng xuất tệp.
Trình tạo dựa vào Web Crypto API được tích hợp trong các trình duyệt hiện đại. Nếu API đó không khả dụng, công cụ sẽ hiển thị lỗi thay vì tạo ID, vì một bộ tạo số ngẫu nhiên không an toàn về mặt mật mã có thể tạo ra các mã định danh dễ đoán hơn hoặc xảy ra va chạm.
So sánh KSUID với UUID
UUID (Mã định danh duy nhất trên toàn cầu) là một định dạng mã định danh thay thế phổ biến. Phiên bản được sử dụng rộng rãi nhất, UUID v4, dài 36 ký tự và gần như hoàn toàn được tạo từ các bit ngẫu nhiên, nên hai UUID không cho biết mã nào được tạo trước.
KSUID khác biệt ở ba điểm:
- Có thể sắp xếp theo thời gian. Các byte dấu thời gian ở đầu khiến việc sắp xếp theo thứ tự chữ cái của chuỗi KSUID cũng sắp xếp chúng theo thời điểm tạo.
- Ngắn hơn. KSUID có 27 ký tự, so với 36 ký tự của UUID tiêu chuẩn.
- Không có dấu phân cách. UUID thường được viết với dấu gạch nối (
xxxxxxxx-xxxx-...); KSUID không có dấu này.
Cả hai định dạng đều có thể được tạo độc lập trên các máy tính khác nhau mà không cần kiểm tra với máy chủ trung tâm, nên cả hai đều tránh được điểm nghẽn do bộ đếm tự tăng trong cơ sở dữ liệu dùng chung.
Các câu hỏi thường gặp
KSUID là viết tắt của gì? K-Sortable Unique Identifier (mã định danh duy nhất có thể sắp xếp theo K). Chữ "K" chỉ đặc điểm có thể sắp xếp của nó ("kind of sortable", tức "có thể sắp xếp ở mức nào đó", theo các ghi chú thiết kế ban đầu của Segment, công ty tạo ra định dạng này).
KSUID dài bao nhiêu? 27 ký tự, được mã hóa bằng base62 (các chữ số 0-9, chữ cái viết hoa và chữ cái viết thường).
Kỷ nguyên KSUID là gì? 13 tháng 5, 2014, 16:53:20 UTC, tức 1.400.000.000 giây sau kỷ nguyên Unix tiêu chuẩn 1 tháng 1, 1970.
Hai KSUID có thể bị trùng không? Khả năng này cực kỳ thấp. Mỗi KSUID chứa 16 byte ngẫu nhiên (128 bit), được tạo bằng bộ tạo số ngẫu nhiên an toàn về mặt mật mã. Ngay cả khi tạo nhiều KSUID trong cùng một giây, xác suất hai mã tình cờ giống nhau vẫn nhỏ đến mức thiên văn.
Có thể khôi phục thời điểm tạo từ một KSUID không? Có. 4 byte đầu tiên của giá trị đã giải mã là dấu thời gian. Cộng số giây đó vào kỷ nguyên KSUID sẽ cho thời điểm tạo ban đầu.
Công cụ này có hỗ trợ tạo nhiều KSUID cùng lúc không? Không. Công cụ tạo một KSUID cho mỗi lần nhấp vào nút "Tạo KSUID". Không có trường nhập số lượng, trường dấu thời gian tùy chỉnh hoặc tính năng xuất/tải xuống.
KSUID có an toàn khi đặt trong URL không? Có. Mã hóa base62 chỉ sử dụng chữ số và chữ cái, nên KSUID không cần mã hóa bổ sung khi xuất hiện trong URL, tên tệp hoặc khóa cơ sở dữ liệu.
Tài liệu tham khảo
- Kho lưu trữ KSUID của Segment trên GitHub: https://github.com/segmentio/ksuid
- "Generating good unique identifiers" của Peter Bourgon: https://peter.bourgon.org/blog/2019/05/20/generating-good-unique-ids.html