UUID v7 là gì và cấu trúc của nó
UUID v7 là một tiêu chuẩn định danh duy nhất toàn cầu phiên bản 7, được thiết kế để kết hợp tính sắp xếp theo thời gian với khả năng không thể đoán trước. Mỗi UUID v7 có độ dài 36 ký tự (theo định dạng chuẩn có dấu gạch ngang) và chứa 128 bit dữ liệu. Phần quan trọng nhất nằm ở 48 bit đầu tiên: đó là dấu thời gian Unix tính bằng mili giây, được lưu trữ dưới dạng số nguyên lớn. Phần còn lại (80 bit) là các bit ngẫu nhiên được tạo bằng trình tạo số ngẫu nhiên mạnh trong trình duyệt.
Cấu trúc cụ thể như sau:
- 48 bit – Unix timestamp (mili giây) – chiếm 12 ký tự đầu tiên trong chuỗi hex.
- 4 bit – phiên bản (version 7) – luôn là
7trong ký tự thứ 13. - 12 bit – trường
rand_a(biến thể và các bit ngẫu nhiên bổ sung). - 62 bit –
rand_b– ngẫu nhiên hoàn toàn.
Kết quả là một chuỗi 36 ký tự có dạng 018f4a9b-7c2e-7d3f-8a9b-0c1d2e3f4a5b. Sáu ký tự đầu tiên (018f4a) biểu diễn timestamp, vì vậy nếu bạn nhìn vào hai UUID v7 được tạo liên tiếp, bạn sẽ thấy chúng bắt đầu bằng cùng một chuỗi nếu được tạo trong cùng một mili giây, hoặc khác nhau nếu cách nhau vài mili giây. Điều này cho phép sắp xếp theo thứ tự thời gian tạo ngay lập tức.
Không giống như UUID v4, nơi tất cả các bit đều ngẫu nhiên và không có bất kỳ mối tương quan thời gian nào, UUID v7 có thể được sắp xếp theo thời gian tạo chỉ bằng cách so sánh chuỗi dưới dạng văn bản hoặc nhị phân. Đây là điểm khác biệt cốt lõi mà công cụ này khai thác.
Tại sao UUID v7 lại quan trọng cho cơ sở dữ liệu phân tán
UUID v4 từ lâu đã là lựa chọn phổ biến cho định danh duy nhất vì dễ tạo và không cần máy chủ trung tâm. Tuy nhiên, nó gây ra vấn đề nghiêm trọng cho hiệu suất cơ sở dữ liệu, đặc biệt là khi được sử dụng làm khóa chính (primary key). Các cơ sở dữ liệu quan hệ và NoSQL thường sử dụng cấu trúc chỉ mục dạng B-tree hoặc LSM-tree. Khi chèn các UUID v4 ngẫu nhiên, các trang chỉ mục bị phân mảnh liên tục vì các giá trị mới không nằm gần nhau theo thứ tự thời gian. Điều này dẫn đến hiện tượng "chèn ngẫu nhiên" làm giảm tốc độ ghi và tăng chi phí bảo trì chỉ mục.
UUID v7 giải quyết triệt để vấn đề này nhờ 48 bit timestamp ở đầu. Khi bạn tạo UUID v7 và lưu làm khóa chính, các bản ghi mới sẽ được chèn vào các trang gần nhau trong B-tree vì timestamp liên tục tăng. Điều này cải thiện đáng kể tính cục bộ chỉ mục (index locality), giảm số lần tách trang và tối ưu hóa hiệu suất ghi.
Tuy nhiên, cần lưu ý một giới hạn quan trọng: UUID v7 không đảm bảo thứ tự tuyệt đối cho các ID được tạo trong cùng một mili giây. Vì phần còn lại sau timestamp là ngẫu nhiên, hai ID trong cùng một mili giây có thể xuất hiện theo bất kỳ thứ tự nào khi sắp xếp. Điều này là chủ ý từ tiêu chuẩn – nó cho phép song song hóa cao mà không cần đồng bộ hóa chặt chẽ giữa các tiến trình. Nếu bạn cần thứ tự chính xác trong cùng một mili giây, bạn sẽ phải dùng các định dạng như ULID (có thêm timestamp nhỏ hơn mili giây) hoặc tự thêm bộ đếm tuần tự. Nhưng đối với hầu hết các ứng dụng, giới hạn này là chấp nhận được.
Cách trang web này tạo UUID v7
Công cụ tạo UUID v7 trên trang này hoàn toàn chạy trong trình duyệt của bạn. Không có dữ liệu nào được gửi đến máy chủ – kể cả số lượng ID bạn yêu cầu hay các tùy chọn định dạng. Điều này có hai ý nghĩa quan trọng:
- Riêng tư tuyệt đối: Không ai có thể thấy được các ID bạn vừa tạo, ngay cả quản trị viên trang web.
- Không phụ thuộc mạng: Bạn có thể tạo ID ngay cả khi đang ngoại tuyến, miễn là trang đã được tải.
Các bước tạo UUID v7 tuân theo đúng tiêu chuẩn IETF draft (hiện đang ở giai đoạn cuối trước khi được chấp nhận làm RFC). Trình duyệt sử dụng API crypto.getRandomValues() để lấy các bit ngẫu nhiên an toàn về mặt mật mã. Timestamp được lấy từ Date.now() – tức thời gian Unix hiện tại tính bằng mili giây. Sau đó, các bit được ghép đúng thứ tự: timestamp (48 bit) + version (4 bit) + rand_a (12 bit) + rand_b (62 bit), và được chuyển đổi thành chuỗi hex 32 ký tự (không dấu gạch ngang), sau đó định dạng lại thành 36 ký tự với dấu gạch ngang nếu người dùng chọn.
Người dùng có thể nhập số lượng ID cần tạo, từ 1 đến 100. Hai tùy chọn hiển thị:
- In hoa (Uppercase): Chuyển tất cả ký tự hex thành chữ hoa. Mặc định là chữ thường. Lưu ý rằng UUID v7 không phân biệt chữ hoa chữ thường về mặt nội dung, nhưng một số hệ thống yêu cầu chữ hoa để tương thích.
- Bao gồm dấu gạch ngang (Include hyphens): Bật/tắt dấu gạch ngang ở các vị trí 8-4-4-4-12. Nếu tắt, bạn nhận được chuỗi 32 ký tự liên tục. Dấu gạch ngang là tùy chọn theo tiêu chuẩn, nhưng nhiều cơ sở dữ liệu và API yêu cầu hoặc ưa thích định dạng có dấu gạch ngang.
Mỗi khi bạn thay đổi bất kỳ tùy chọn nào (số lượng, in hoa, dấu gạch ngang), danh sách ID sẽ được tạo lại ngay lập tức. Trạng thái "Sẵn sàng" chuyển thành "Đã tạo" sau khi hoàn thành, và khi bạn sao chép tất cả ID, trạng thái hiển thị "Đã sao chép tất cả!".
Các tùy chọn định dạng và quy tắc sử dụng
Bảng dưới đây tóm tắt các tùy chọn và ảnh hưởng của chúng:
| Tùy chọn | Giá trị | Mô tả | Ví dụ |
|---|---|---|---|
| Số lượng | 1–100 | Số UUID v7 được tạo | 10 |
| In hoa | Bật/Tắt | Chuyển chữ thường thành chữ hoa | 018F4A9B-7C2E-7D3F-8A9B-0C1D2E3F4A5B |
| Dấu gạch ngang | Bật/Tắt | Bao gồm hoặc bỏ qua dấu gạch ngang | 018f4a9b7c2e7d3f8a9b0c1d2e3f4a5b (không gạch ngang) |
Quy tắc quan trọng:
- Giới hạn 100: Bạn không thể tạo nhiều hơn 100 ID cùng lúc. Đây là giới hạn thiết kế để tránh làm chậm trình duyệt và giữ cho giao diện phản hồi nhanh.
- Tái tạo ngay lập tức: Bất kỳ thay đổi nào cũng kích hoạt việc tạo lại toàn bộ danh sách. Không có nút "Tạo" riêng – hành động tạo xảy ra tự động.
- Sao chép từng ID hoặc tất cả: Bạn có thể bấm vào một ID riêng lẻ để sao chép nó vào clipboard (sử dụng API
navigator.clipboard.writeText). Nút "Sao chép tất cả" sao chép toàn bộ danh sách, mỗi ID trên một dòng. - Định dạng đầu ra: Các ID được hiển thị dưới dạng văn bản, mỗi ID trên một dòng. Không có thêm thông tin bổ sung.
So sánh UUID v7 với các định dạng khác
Để giúp bạn chọn đúng định dạng, bảng dưới đây so sánh UUID v7 với các đối thủ chính:
| Đặc điểm | UUID v7 | UUID v4 | ULID | NanoID |
|---|---|---|---|---|
| Độ dài chuỗi | 36 ký tự (có gạch ngang) / 32 (không gạch ngang) | 36/32 | 26 ký tự | 21 ký tự (mặc định) |
| Phần timestamp | 48 bit (miligiây Unix) | Không | 48 bit (miligiây) + 10 bit (phiên bản) | Không |
| Có thể sắp xếp theo thời gian tạo | Có (không chặt chẽ trong cùng miligiây) | Không | Có (chặt chẽ hơn nhờ bit phụ) | Không |
| Ngẫu nhiên / không đoán được | 80 bit ngẫu nhiên | 122 bit ngẫu nhiên | 80 bit ngẫu nhiên | 21 byte (168 bit) ngẫu nhiên |
| Bảng chữ cái | Hex (0-9 a-f) | Hex | Crockford Base32 (0-9 A-Z, không I L O U) | Base64url (A-Z a-z 0-9 - _) |
| Tiêu chuẩn hóa | Đang được IETF đồng thuận | RFC 4122 (cũ) | Không chính thức | Không chính thức |
| Tương thích chỉ mục B-tree | Tốt | Kém | Tốt | Kém |
UUID v7 là sự dung hòa giữa sắp xếp thời gian và tính ngẫu nhiên. Nó không mạnh về tần suất ngẫu nhiên như UUID v4 (80 bit so với 122 bit), nhưng vẫn đủ cho hầu hết các ứng dụng (khả năng va chạm gần như bằng 0 trong thực tế). ULID cung cấp thứ tự chặt chẽ hơn trong cùng miligiây nhờ có thêm 10 bit timestamp phụ (cho độ phân giải millisecond + 10 bit), nhưng UUID v7 đang trở thành tiêu chuẩn thực tế trong cộng đồng nhờ sự ủng hộ của IETF và ưu điểm dễ triển khai.
Các trường hợp sử dụng thực tế
1. Hệ thống phân tán với khóa chính sắp xếp được Nếu bạn xây dựng ứng dụng microservices hoặc hệ thống sự kiện, UUID v7 là lựa chọn lý tưởng cho khóa chính. Ví dụ: khi lưu trữ các sự kiện trong bảng event sourcing, bạn có thể sắp xếp chúng theo thời gian tạo mà không cần thêm cột timestamp riêng – chỉ việc sắp xếp theo UUID.
2. Cải thiện hiệu suất cơ sở dữ liệu Các quản trị viên cơ sở dữ liệu thường chứng kiến sự cải thiện rõ rệt khi chuyển từ UUID v4 sang v7: tốc độ chèn có thể tăng 30–50% trong một số workload, đặc biệt khi bảng có dung lượng lớn và chỉ mục bị phân mảnh nhiều. Điều này quan trọng trong các hệ thống ghi nhiều (write-heavy) như log, audit trail, hay message queue.
3. Định danh không đoán được nhưng có thứ tự thời gian Trong các ứng dụng yêu cầu bảo mật (ví dụ: token đặt lại mật khẩu, ID giao dịch), bạn cần ID không thể đoán trước nhưng vẫn có thể xác định thứ tự tạo. UUID v7 đáp ứng cả hai: 80 bit ngẫu nhiên đảm bảo không thể brute-force, trong khi timestamp giúp phát hiện sớm các truy vấn bất thường (ví dụ: ID có timestamp quá cũ).
4. Di chuyển từ UUID v4 lên v7
Nếu bạn đang sử dụng UUID v4 và muốn chuyển sang v7 mà không phá vỡ hệ thống hiện tại, bạn có thể tạo UUID v7 mới song song với v4 cũ. Sau đó dần dần thay thế. Vì cả hai đều là UUID 128 bit, bạn có thể lưu chúng trong cùng kiểu dữ liệu (ví dụ: uuid trong PostgreSQL) mà không gặp vấn đề tương thích.
Câu hỏi thường gặp
1. UUID v7 có đảm bảo thứ tự tuyệt đối không? Không. UUID v7 chỉ đảm bảo thứ tự dựa trên timestamp miligiây. Nếu hai ID được tạo trong cùng một miligiây, thứ tự của chúng là ngẫu nhiên. Điều này là do thiết kế – nó cho phép nhiều tiến trình tạo ID đồng thời mà không cần đồng bộ hóa.
2. Tại sao giới hạn số lượng ID là 100? Giới hạn này nhằm giữ cho trình duyệt không bị chậm và đảm bảo giao diện phản hồi nhanh. Nếu cần tạo nhiều hơn, bạn có thể thực hiện nhiều lần hoặc viết script tự động.
3. Tôi có thể tạo UUID v7 mà không cần kết nối mạng không?
Có. Tất cả quá trình tạo diễn ra trong trình duyệt của bạn, sử dụng crypto.getRandomValues() và Date.now(). Chỉ cần trang đã được tải là bạn có thể tạo UUID v7 ngoại tuyến.
4. Dấu gạch ngang có bắt buộc trong UUID v7 không? Theo tiêu chuẩn IETF draft, UUID v7 có thể được biểu diễn có hoặc không có dấu gạch ngang. Định dạng có dấu gạch ngang (8-4-4-4-12) là phổ biến nhất và được khuyến nghị. Tuy nhiên nhiều cơ sở dữ liệu và API chấp nhận cả hai. Công cụ của chúng tôi cho phép bạn chuyển đổi giữa hai định dạng chỉ bằng một nút bấm.
5. Phần ngẫu nhiên trong UUID v7 có an toàn không?
Có. Các bit ngẫu nhiên được tạo bằng crypto.getRandomValues(), là trình tạo số ngẫu nhiên mật mã học (CSPRNG) do hệ điều hành cung cấp. Nó đáp ứng tiêu chuẩn bảo mật cho các ứng dụng yêu cầu độ không đoán trước cao, chẳng hạn như token xác thực.
6. UUID v7 khác gì so với ULID? Cả hai đều kết hợp timestamp và ngẫu nhiên, nhưng ULID sử dụng bảng chữ cái Crockford Base32 (dễ đọc hơn, loại bỏ các ký tự gây nhầm lẫn) và có thêm 10 bit timestamp phụ giúp sắp xếp chặt chẽ hơn trong cùng miligiây. UUID v7 sử dụng hex và là tiêu chuẩn IETF, do đó tương thích tốt hơn với các hệ thống hiện có và dễ triển khai hơn trong các thư viện. ULID có độ dài ngắn hơn (26 so với 36 ký tự), nhưng UUID v7 lại là UUID "chính thống" hơn.