ULID là gì?
ULID (Định danh duy nhất có thể sắp xếp theo thứ tự từ điển toàn cầu) là định dạng định danh 128-bit được thiết kế để khắc phục các hạn chế của UUID. Nó bao gồm:
- Timestamp: 48 bit thời gian Unix với độ chính xác đến mili giây
- Randomness: 80 bit dữ liệu ngẫu nhiên an toàn mật mã
- Encoding: Biểu diễn Base32 (26 ký tự)
Ví dụ định dạng: 01ARZ3NDEKTSV4RRFFQ69G5FAV
Cách ULID hoạt động
- Tạo 48 bit cho dấu thời gian (thời gian Unix tính bằng mili giây)
- Tạo 80 bit dữ liệu ngẫu nhiên an toàn mật mã
- Kết hợp dấu thời gian (quan trọng nhất) với dữ liệu ngẫu nhiên (ít quan trọng nhất)
- Mã hóa toàn bộ giá trị 128-bit sử dụng bảng chữ cái Base32 của Crockford
- Kết quả là chuỗi 26 ký tự (10 ký tự đầu là dấu thời gian, 16 ký tự cuối là dữ liệu ngẫu nhiên)
Ưu điểm & Cân nhắc
Advantages | Considerations |
---|---|
|
|
Cấu trúc ULID
Component | Bits | Characters | Description |
---|---|---|---|
Timestamp | 48 bit | 10 ký tự | Unix timestamp (ms) được mã hóa bằng Base32 |
Randomness | 80 bit | 16 ký tự | Byte ngẫu nhiên được mã hóa bằng Base32 |
So sánh ULID và UUID
Feature | ULID | UUID v1 | UUID v4 | UUID v7 |
---|---|---|---|---|
Size | 128 bit | 128 bit | 128 bit | 128 bit |
Độ dài chuỗi | 26 ký tự | 36 ký tự | 36 ký tự | 36 ký tự |
Time-based | ✅ | ✅ | ❌ | ✅ |
Sắp xếp tự nhiên | ✅ | ❌ | ❌ | ✅ |
An toàn cho URL | ✅ | ❌ | ❌ | ❌ |
Lộ địa chỉ MAC | ❌ | ✅ | ❌ | ❌ |
Thành phần ngẫu nhiên | ✅ | ❌ | ✅ | ✅ |
Tiêu chuẩn chính thức | ❌ | ✅ | ✅ | ⚠️ Bản nháp |
Các trường hợp sử dụng phổ biến
- Khóa chính cơ sở dữ liệu: Chỉ mục tối ưu hiệu suất
- Hệ thống phân tán: Tạo không cần phối hợp
- APIs: Định danh sạch, an toàn cho URL
- Dữ liệu chuỗi thời gian: Sắp xếp theo thứ tự thời gian gốc
- Hệ thống ghi nhật ký: Định danh sự kiện có thể sắp xếp
- Ứng dụng hiện đại: Nơi hạn chế của UUID gây ra vấn đề
Tại sao chọn ULID?
- Sortability: Sắp xếp theo thứ tự từ điển dựa trên thời gian tạo
- An toàn cho URL: Không cần mã hóa URL (khác với UUID có dấu gạch ngang)
- Compactness: 26 ký tự so với 36 ký tự của UUID
- Không phân biệt chữ hoa chữ thường: Giảm lỗi nhập liệu của người dùng
- Monotonicity: Tùy chọn sắp xếp đơn điệu trong cùng mili giây
- Không có ký tự đặc biệt: Định dạng đơn giản, chỉ gồm chữ và số
Câu hỏi thường gặp
ULID so với UUID v7 như thế nào?
Cả hai đều sử dụng Unix timestamps để có thể sắp xếp và có các thành phần ngẫu nhiên. Sự khác biệt chính là mã hóa (Base32 so với hex), định dạng (26 ký tự so với 36), và tiêu chuẩn hóa (UUID v7 đang trong bản nháp RFC).
Tôi có thể lấy thời gian tạo từ ULID không?
Có. 10 ký tự đầu tiên đại diện cho dấu thời gian Unix với độ chính xác mili giây có thể được giải mã và chuyển đổi thành định dạng datetime chuẩn.
ULID có tương thích với trường cơ sở dữ liệu UUID không?
Không. ULID sử dụng định dạng khác và cần được lưu dưới dạng chuỗi hoặc dữ liệu nhị phân thay vì kiểu dữ liệu UUID gốc trong cơ sở dữ liệu.
Tính đơn điệu trong ULID là gì?
Một số triển khai ULID cung cấp tùy chọn đơn điệu đảm bảo thứ tự sắp xếp tuần tự ngay cả trong cùng mili giây bằng cách tăng thành phần ngẫu nhiên cho các ULID được tạo trong cùng dấu thời gian.
ULID sử dụng bộ ký tự nào?
ULID sử dụng mã hóa Base32 của Crockford (0-9, A-Z trừ I, L, O, U) được thiết kế để giảm nhầm lẫn và lỗi khi đọc hoặc nhập thủ công.
Resources
Bảng chữ cái Base32 của Crockford
Giá trị mã hóa | Character | Notes |
---|---|---|
0-9 | 0-9 | Chữ số thập phân |
10-31 | A-Z | Loại trừ I, L, O, U để dễ đọc |
Ký tự: 0123456789ABCDEFGHJKMNPQRSTVWXYZ
Mã hóa này không phân biệt chữ hoa chữ thường khi giải mã (nhưng ULID thường được tạo ở dạng chữ hoa).