UUID v4 hay v7: nên dùng loại nào, và vì sao quan trọng
Dùng UUID v4 khi bạn chỉ cần một mã định danh ngẫu nhiên. Dùng UUID v7 khi mã đó sẽ là khóa trong cơ sở dữ liệu, hoặc khi bạn muốn các ID được sắp xếp theo thời điểm tạo. Cả hai đều là số 128 bit, được viết theo cùng một dạng 36 ký tự, nên khác biệt nằm ở cách sắp xếp các bit. Công cụ tạo UUID bên dưới tạo được cả hai phiên bản, từ 1 đến 500 mã mỗi lần, ngay trên trình duyệt của bạn.
Công cụ tạo UUIDCần ID duy nhất cho mã nguồnDùng miễn phíUUID trông như thế nào
UUID, hay mã định danh duy nhất toàn cầu, là một số 128 bit được viết bằng 32 chữ số thập lục phân, chia thành năm nhóm: 8, 4, 4, 4 và 12 chữ số, ngăn cách bằng dấu gạch nối. Ví dụ: 3f2b8c1e-6d4a-4f7b-9c2e-8a1d5e0b7f63.
Một số phần của con số này được cố định. Bốn bit dùng để ghi phiên bản, nên nhóm thứ ba bắt đầu bằng 4 với v4 hoặc 7 với v7. Hai bit dùng để ghi biến thể, nên nhóm thứ tư bắt đầu bằng 8, 9, a hoặc b. Phần còn lại mang chính mã định danh. Chính vì các bit phiên bản và biến thể mà một UUID v4 chỉ có 122 bit ngẫu nhiên, không phải 128.
UUID v4: ngẫu nhiên
UUID v4 hoàn toàn ngẫu nhiên, ngoại trừ các bit cố định kể trên. 122 bit ngẫu nhiên khiến việc trùng lặp cực kỳ khó xảy ra. Giả sử bạn tạo một tỷ UUID v4. Xác suất để hai mã bất kỳ trùng nhau xấp xỉ n bình phương chia cho hai lần số giá trị có thể, tức khoảng 10 mũ âm 19. Nói cách khác, bạn không cần phải lo thiết kế để tránh va chạm.
Ước tính này giả định bộ tạo số lấy bit từ nguồn ngẫu nhiên an toàn về mặt mật mã. Nếu bộ tạo số có thể đoán trước, ước tính đó sẽ không còn đúng. Công cụ này dùng nguồn ngẫu nhiên mật mã của trình duyệt, thông qua crypto.randomUUID hoặc crypto.getRandomValues.
UUID v7: thời gian đứng trước
RFC 9562 định nghĩa v7. 48 bit đầu tiên chứa thời gian Unix tính bằng mili giây, nên một ID được tạo sau sẽ có phần đầu lớn hơn ID được tạo trước. Sau đó là các bit phiên bản, rồi đến bit ngẫu nhiên, bit biến thể và thêm bit ngẫu nhiên. Một phần không gian ngẫu nhiên có thể chứa bộ đếm, giúp các ID vẫn giữ đúng thứ tự khi nhiều ID được tạo trong cùng một mili giây.
Vì thời gian nằm ở đầu, nếu sắp xếp các ID v7 dưới dạng văn bản, với cùng một kiểu chữ, chúng sẽ được xếp theo thời điểm tạo, chính xác đến mili giây. Điều này đúng vì các chữ số thập lục phân có độ dài cố định và phần thời gian nằm ở các ký tự đầu.
Thời gian cũng hiển thị công khai. Ai đọc một UUID v7 đều có thể biết gần đúng thời điểm nó được tạo. Bạn có thể tự kiểm tra bằng ô Inspect trong Công cụ tạo UUID, công cụ này sẽ chuyển 48 bit đầu thành ngày và giờ.
Vì sao v7 phù hợp với chỉ mục cơ sở dữ liệu
Chỉ mục cơ sở dữ liệu thường là B-tree, một cấu trúc được giữ theo thứ tự sắp xếp của khóa. Khi khóa là ngẫu nhiên, như với v4, mỗi hàng mới sẽ rơi vào một vị trí ngẫu nhiên trong chỉ mục. Khi đó cơ sở dữ liệu phải ghi vào nhiều phần khác nhau của chỉ mục, gây ra nhiều lần tách trang hơn và nhiều lần trượt bộ nhớ đệm hơn. Trên một bảng lớn, những chi phí này cộng dồn lại.
Khóa v7 lớn hơn gần như mọi khóa đã có trong chỉ mục, vì phần thời gian của nó luôn tăng. Các hàng mới được thêm gần cuối chỉ mục, giống như khi dùng số tự tăng. Các trang chỉ mục gần đây vẫn nằm trong bộ nhớ và việc ghi dữ liệu gọn gàng hơn. Sự khác biệt rõ nhất ở những bảng lớn và liên tục tăng trưởng, còn với bảng nhỏ thì gần như không nhận ra.
Chọn giữa v4 và v7
- Khóa chính trong cơ sở dữ liệu, hoặc bất kỳ bảng nào tăng dần theo thời gian: v7. Chỉ mục luôn được sắp xếp có trật tự.
- Nhật ký, sự kiện hoặc tin nhắn mà bạn thường sắp xếp theo thời gian: v7, vì bản thân ID đã mang thứ tự.
- ID công khai mà thời điểm tạo cần được giữ kín: v4. Một ID v7 sẽ tiết lộ thời điểm nó được tạo.
- Nhiều thiết bị với đồng hồ không đáng tin cậy: cả v4 và v7 đều giữ được tính duy nhất, vì phần việc đó do các bit ngẫu nhiên đảm nhận. Chỉ có thứ tự sắp xếp của v7 là phụ thuộc vào đồng hồ chính xác.
Cả hai phiên bản đều là chuẩn, nhưng các thư viện cũ có thể chỉ hỗ trợ v4. RFC 4122 đã mô tả các phiên bản từ 1 đến 5 trong nhiều năm. RFC 9562 được công bố vào tháng 5 năm 2024, thay thế RFC 4122 và định nghĩa các phiên bản 6, 7 và 8. Trước khi phụ thuộc vào một thư viện, hãy kiểm tra xem nó có hỗ trợ v7 hay không.
Lưu trữ UUID
Một UUID viết dưới dạng văn bản chiếm 36 ký tự. 16 byte của nó có thể được lưu ở dạng nhị phân, tốn ít dung lượng hơn nhiều. Nhiều cơ sở dữ liệu có kiểu UUID riêng hoặc cột nhị phân 16 byte cho mục đích này, và so sánh nhanh hơn so với văn bản.
Hãy chọn một định dạng và giữ nguyên. Chữ hoa, chữ thường, dấu gạch nối và dấu ngoặc nhọn đều là cùng một UUID với con người, nhưng cơ sở dữ liệu hoặc phép so sánh chuỗi có thể coi chúng là những giá trị khác nhau. Các tùy chọn chữ hoa, không có dấu gạch nối và dấu ngoặc nhọn của công cụ tồn tại cho những hệ thống cần đúng các dạng đó.
Đừng bao giờ dùng UUID làm bí mật
UUID là mã định danh, không phải mật khẩu, token phiên đăng nhập hay khóa truy cập. Nó được thiết kế để duy nhất, chứ không phải để không thể đoán. UUID v7 còn mang theo thời điểm tạo. Và các mã định danh thường bị dán vào liên kết, nhật ký, email và ảnh chụp màn hình, nơi bất kỳ ai nhìn thấy đều có thể dùng lại.
Việc kiểm soát truy cập phải nằm ở phía máy chủ. Người biết một ID không nên tự động được phép xem hay thay đổi bản ghi mà ID đó chỉ đến. Với mật khẩu, cụm mật khẩu hoặc token, hãy dùng công cụ được thiết kế riêng cho bí mật. Trình tạo mật khẩu tạo mật khẩu ngẫu nhiên hoặc cụm mật khẩu từ ghép ngay trên thiết bị của bạn, với tính ngẫu nhiên an toàn, và ước tính độ mạnh của chúng. Để hiểu vì sao độ dài và tính ngẫu nhiên quan trọng, hãy đọc mật khẩu mạnh và entropy.
Cách dùng công cụ
- Chọn phiên bản 4 cho ID ngẫu nhiên, hoặc phiên bản 7 cho ID được sắp xếp theo thời gian.
- Đặt số lượng, từ 1 đến 500 mỗi lần.
- Chọn chữ hoa, không có dấu gạch nối hoặc dấu ngoặc nếu mã của bạn yêu cầu một dạng cụ thể.
- Sao chép tất cả, hoặc tải danh sách về dưới dạng tệp .txt.
- Dán một UUID bất kỳ vào phần Inspect để xem phiên bản, biến thể và, với v7, thời gian được nhúng trong đó.
Câu trả lời nhanh
UUID v4 có thật sự duy nhất không? Trong thực tế thì có. 122 bit ngẫu nhiên khiến việc trùng lặp rất khó xảy ra, nên bạn không cần kiểm tra.
Tôi có nên dùng v7 cho mọi thứ không? Không phải lúc nào cũng vậy. Hãy dùng v7 cho khóa cơ sở dữ liệu và mọi thứ được sắp xếp theo thời gian. Dùng v4 khi thời điểm tạo nên được giữ kín.
Tôi có thể dùng UUID làm mật khẩu không? Không. UUID là mã định danh. Với bất cứ thứ gì cần giữ bí mật, hãy dùng trình tạo mật khẩu.
Công cụ có gửi ID đi đâu không? Không. Các ID được tạo và hiển thị ngay trên trình duyệt của bạn, và không được gửi lên máy chủ.
Được dịch từ Bản tiếng Anh với sự hỗ trợ của AI.
Bình luận
Chưa có bình luận nào. Hãy là người đầu tiên.


