03 / HƯỚNG DẪN
UUID vs ULID: chọn định danh cho ứng dụng của bạn
UUID v4 so với v7, cấu trúc và khả năng sắp xếp của ULID, định danh ngẫu nhiên làm gì với chỉ mục B-tree, xác suất va chạm, lộ trong URL, và tạo định danh cục bộ.
Định danh ứng dụng phải làm gì
Định danh sinh có một việc — duy nhất — cùng vài việc nhặt được dọc đường: sinh ở bất cứ đâu không cần phối hợp, lưu gọn, sắp xếp dự đoán được, và không lộ thứ gì đáng xấu hổ. UUID và ULID đều qua thanh duy nhất; chúng khác nhau ở mọi thứ sau đó.
- Không phối hợpSinh phi tập trung: bất kỳ service, worker hay tab trình duyệt nào cũng đúc định danh mà không hỏi bộ đếm trung tâm, và đó là thứ làm cả hai định dạng hợp hệ phân tán.
- Cùng 128 bit128 bit cả hai đường: UUID là giá trị 128 bit viết thành 36 ký tự hex có gạch nối; ULID mang cùng 128 bit thành 26 ký tự base32.
- Bố cục là khác biệtCâu hỏi thật là bố cục: bit nào ngẫu nhiên và bit nào mã hóa thời gian quyết định định danh hành xử thế nào trong chỉ mục và nó tiết lộ gì.
Phiên bản UUID: v4 ngẫu nhiên, v7 theo thời gian
RFC 9562 định nghĩa vài phiên bản UUID, nhưng hai cái thống trị công việc ứng dụng. Phiên bản 4 lấp 122 trong 128 bit bằng ngẫu nhiên và không nhúng gì khác; phiên bản 7 mở đầu bằng dấu thời gian Unix 48 bit tính mili giây và lấp 74 bit còn lại bằng ngẫu nhiên.
- v4: ngẫu nhiên thuầnv4 là lựa chọn riêng tư tối đa: giá trị chẳng nói gì về khi nào hay ở đâu nó được tạo, và 122 bit ngẫu nhiên là nhiều duy nhất hơn bất kỳ ứng dụng nào tiêu nổi.
- v7: thời gian trướcv7 chủ yếu được sắp theo dấu thời gian mili giây. Thứ tự trong cùng mili giây và giữa các thiết bị còn phụ thuộc bộ tạo và đồng hồ.
- Bỏ qua v1Phiên bản cũ là legacy: v1 nhúng địa chỉ MAC và giá trị đồng hồ, lộ cả hai; v3 và v5 là hash theo tên để dẫn xuất ID ổn định, không phải ngẫu nhiên mới.
ULID: sắp xếp được và gọn dạng văn bản
ULID là 26 ký tự base32 Crockford: 10 ký tự đầu mã hóa dấu thời gian mili giây 48 bit, 16 ký tự còn lại mã hóa 80 bit ngẫu nhiên. Bảng chữ cố ý loại I, L, O và U, nên định danh sống sót khi bị đọc to hay gõ lại từ ảnh chụp màn hình.
- Sắp chuỗi = sắp thời gianThứ tự từ điển là thứ tự thời gian: sắp xếp ULID như chuỗi thuần là sắp xếp theo thời điểm tạo mà không cần parse — hữu ích trong dòng log, tên tệp và kho key-value.
- 26 ký tự an toànGọn và an toàn URL: 26 ký tự không phân biệt hoa thường, không gạch nối hay ký hiệu, ngắn hơn 36 của UUID và an toàn trong mọi đoạn đường dẫn hay tham số truy vấn.
- Đơn điệu theo mili giâyTrong một mili giây, thứ tự đến từ phần ngẫu nhiên; trình tạo tăng nó đơn điệu — như trình tạo hàng loạt Toolars — giữ kể cả định danh cùng mili giây theo thứ tự sinh.
ID ngẫu nhiên phân mảnh chỉ mục của bạn
Chỉ mục B-tree có thứ tự, và chèn UUID v4 ngẫu nhiên ghi vào lá ngẫu nhiên mỗi lần: trang tách, cache đệm xáo trộn, và chỉ mục phình khoảng chết. Định danh theo thời gian nối gần mép phải chỉ mục, biến chèn thành ca tốt nhất của B-tree.
Đó là lý do lựa chọn thuộc lúc thiết kế schema, không phải sau quý chậm đầu tiên: di trú khóa chính nghĩa là viết lại mọi hàng và mọi khóa ngoại tham chiếu nó. Nếu bảng sẽ nhỏ, sự hỗn loạn của v4 không bao giờ lộ ra; nếu nó lớn thành hàng trăm triệu hàng dưới ghi liên tục, định dạng có thứ tự trả tiền thuê từ ngày một.
- Ngẫu nhiên rải rácVới v4 làm khóa chính, bảng chèn nặng cho thấy nhiều tách trang hơn, hệ số lấp thấp hơn, và thông lượng ghi tệ hơn đo được so với khóa có thứ tự cùng kích thước.
- Có thứ tự nối đuôiv7 và ULID cải thiện tính liền kề của chỉ mục mà không cần điều phối tập trung. ID sát nhau trong một lô tăng đơn điệu có thể dự đoán được; luôn kiểm tra quyền truy cập độc lập với ID.
- Đo sự đánh đổiSự đánh đổi là thật nhưng khiêm tốn: 128 bit gấp đôi lưu trữ bigint, và khóa theo thời gian dồn ghi hôm nay vào mép phải chỉ mục, thứ chỉ quan trọng ở tốc độ chèn rất cao.
Va chạm, URL, và điều ID tiết lộ
Với 122 bit ngẫu nhiên độc lập ở v4, một tỷ ID có xác suất va chạm khoảng một trên 10^19. 80 bit ngẫu nhiên của ULID bảo vệ một phạm vi khác: các ID được tạo trong cùng mili giây.
Dán bất kỳ giá trị khả nghi nào vào trình xác thực: nó nhận dạng UUID 36 ký tự chuẩn với nibble variant và phiên bản RFC 9562, bảng chữ ULID 26 ký tự với quy tắc tràn, và nó báo dấu thời gian nhúng cho định dạng theo thời gian — nên giá trị từ log cho bạn biết nó là gì trước khi bạn xây trên nó.
- Xác suất không đáng kểKhông định dạng nào là ranh giới bảo mật: định danh trong URL ổn để định địa chỉ, nhưng ai thấy cũng trích dẫn được — ủy quyền phải đến từ kiểm tra truy cập, không phải từ sự mờ mịt của ID.
- ID không phải bí mậtv7 và ULID lộ thời điểm tạo theo thiết kế; trình xác thực trích nó công khai. Đó thường là metadata vô hại, nhưng hãy quyết có ý thức cho đối tượng hướng công chúng.
- Thời gian nhìn thấyID cơ sở dữ liệu tuần tự lộ khối lượng và tốc độ tăng trưởng; định danh ngẫu nhiên và thời gian-ngẫu nhiên chẳng tiết lộ gì về có bao nhiêu bản ghi.
Tạo và xác thực không cần máy chủ
Sinh định danh cần đúng một tài nguyên khan hiếm — ngẫu nhiên tốt — và trình duyệt đã có nó. Không gian làm việc rút từ crypto.getRandomValues, tạo hàng loạt hoàn toàn trong tab, và không bao giờ truyền một giá trị nào.
- 1–100 mỗi lượtChọn UUID v4, UUID v7 hoặc ULID và tạo 1 đến 100 mỗi lượt; lượt v7 và ULID tăng trường ngẫu nhiên đơn điệu, nên cả lượt giữ thứ tự sinh.
- Hoa thường và xuấtHoa thường đầu ra là lựa chọn hiển thị: chuẩn, hoa, hoặc thường, với sao chép tất cả cùng tải xuống văn bản phân tách xuống dòng và CSV ghi thời gian nhúng của từng định danh.
- Xác thực tức thìXác thực trả lời câu hỏi cấu trúc tức thì: độ dài, bảng chữ, phiên bản và variant UUID, giá trị đặc biệt nil và max, tràn ULID, và dấu thời gian nhúng ở UTC.
ULID là base32; token của bạn có lẽ là Base64.
Mã hóa byte-thành-văn bản nằm dưới mọi định danh và token — tìm hiểu chúng tốn gì và xứng đáng ở đâu.