Trình tạo ULID

Tạo định danh có thể sắp xếp theo thứ tự từ điển với dấu thời gian và tính ngẫu nhiên

Thử các ví dụ này:

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

  1. Tạo 48 bit cho dấu thời gian (thời gian Unix tính bằng mili giây)
  2. Tạo 80 bit dữ liệu ngẫu nhiên an toàn mật mã
  3. 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)
  4. Mã hóa toàn bộ giá trị 128-bit sử dụng bảng chữ cái Base32 của Crockford
  5. 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

AdvantagesConsiderations
  • Có thể sắp xếp theo thứ tự từ điển
  • Bộ ký tự an toàn cho URL
  • Không cần mã hóa đặc biệt
  • Case-insensitive
  • Không có vấn đề về quyền riêng tư
  • Mới hơn, ít được sử dụng rộng rãi
  • Hỗ trợ thư viện hạn chế
  • Không tương thích với UUID
  • Không thể quay lại trước năm 1970

Cấu trúc ULID

ComponentBitsCharactersDescription
Timestamp48 bit10 ký tựUnix timestamp (ms) được mã hóa bằng Base32
Randomness80 bit16 ký tựByte ngẫu nhiên được mã hóa bằng Base32

So sánh ULID và UUID

FeatureULIDUUID v1UUID v4UUID v7
Size128 bit128 bit128 bit128 bit
Độ dài chuỗi26 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óaCharacterNotes
0-90-9Chữ số thập phân
10-31A-ZLoạ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).