Tạo UUID
Riêng tư — file của bạn không bao giờ bị lưu trữ
Phiên bản nào?
0 UUID của bạn sẽ hiện ở đây.
Cách hoạt động
Chọn phiên bản
v4 cho mọi thứ cần không thể đoán được. v7 cho khóa cơ sở dữ liệu. Sự khác biệt được giải thích ngay trên trang thay vì mặc định bạn đã biết.
Chọn số lượng
Một cái, hoặc tối đa mười nghìn cái cùng lúc, với định dạng tùy chọn — chữ hoa, ngoặc nhọn, không gạch nối, hoặc danh sách có ngoặc kép sẵn sàng cho code.
Sao chép
Sao chép tất cả, hoặc tải xuống dưới dạng file văn bản.
Phiên bản 4 hay phiên bản 7, và vì sao điều đó quan trọng trong cơ sở dữ liệu
UUID là 128 bit được viết thành 32 chữ số hex theo cách nhóm quen thuộc 8-4-4-4-12. Sáu trong số các bit đó dùng để cho biết phiên bản và biến thể, còn lại 122 bit ngẫu nhiên ở phiên bản 4 — đủ để bạn có thể tạo một tỷ UUID mỗi giây trong suốt một thế kỷ mà khả năng gặp hai cái trùng nhau vẫn cực kỳ thấp. Đó là toàn bộ sức hấp dẫn của nó: hai hệ thống chưa từng liên lạc với nhau đều có thể tự tạo định danh và yên tâm rằng chúng sẽ không bao giờ trùng.
Để điều đó đúng, tính ngẫu nhiên phải là thật, và ở đây nó đến từ nguồn ngẫu nhiên mật mã chứ không phải bộ tạo số ngẫu nhiên thông thường. Sự khác biệt này quan trọng khi định danh được dùng làm token cấp quyền — link đặt lại mật khẩu, URL chia sẻ không thể đoán — vì một bộ tạo dễ đoán cho phép người khác suy ra giá trị tiếp theo từ các giá trị trước. Với nguồn mật mã thì không có gì để đoán.
Phiên bản 7 ra đời vì phiên bản 4 hoạt động kém khi làm khóa chính trong cơ sở dữ liệu. Nó đặt dấu thời gian 48 bit tính bằng mili giây ở đầu và lấp phần còn lại bằng dữ liệu ngẫu nhiên, nên các UUID tạo liên tiếp sẽ sắp xếp theo đúng thứ tự được tạo. Nghe có vẻ chỉ là hình thức nhưng không phải vậy: một khóa ngẫu nhiên rải mỗi lần chèn ra khắp toàn bộ chỉ mục, nên mỗi lần ghi chạm vào một trang khác nhau và bộ nhớ đệm không còn tác dụng, trong khi khóa theo thứ tự thời gian chỉ nối thêm vào một đầu. Trên bảng lớn, chênh lệch về tốc độ chèn là đáng kể, và đó là lý do v7 được chuẩn hóa.
Sự đánh đổi là có thật và đáng cân nhắc. UUID phiên bản 7 cho bất kỳ ai nhìn thấy nó biết đại khái thời điểm nó được tạo, chính xác đến mili giây, và một chuỗi UUID như vậy tiết lộ tốc độ bạn tạo bản ghi. Với khóa nội bộ thì không sao. Với định danh lộ ra trong URL — mã đơn hàng, link tài liệu, id người dùng — đó là một sự rò rỉ thông tin nhỏ mà phiên bản 4 không có. Hãy dùng v7 cho khóa chính và v4 cho mọi thứ công khai nếu cả hai đều quan trọng.
Khi bạn cần công cụ khác
Hãy tạo UUID ở nơi chúng được dùng. Mọi cơ sở dữ liệu và ngôn ngữ đều có sẵn chức năng này — gen_random_uuid() trong PostgreSQL, UUID() trong MySQL, crypto.randomUUID() trong JavaScript, uuid.uuid4() trong Python — và tạo một loạt trong trình duyệt rồi dán vào code thì ổn cho dữ liệu mẫu hay bài test, nhưng sai với bất cứ thứ gì thực sự chạy.
Nếu lý do chọn v7 là để có khóa sắp xếp được, có những lựa chọn khác đáng biết. ULID thể hiện cùng ý tưởng trong 26 ký tự, ngắn hơn và không phân biệt chữ hoa chữ thường; định danh Snowflake vừa trong 64 bit, giảm một nửa kích thước chỉ mục so với 128 bit của UUID. Và trong nhiều cơ sở dữ liệu, một số nguyên tự tăng thông thường vẫn nhanh hơn và nhỏ hơn tất cả — UUID chỉ đáng với cái giá của nó khi định danh phải được tạo ở nhiều nơi cùng lúc, còn không thì không.
Câu hỏi thường gặp
v4 hay v7 — tôi cần loại nào?
Nếu là khóa chính trong cơ sở dữ liệu, chọn v7. Nếu nó phải không thể đoán được — link đặt lại mật khẩu, mã mời, định danh phiên đăng nhập — chọn v4. Đó là toàn bộ quyết định, và phần lớn mọi người không bao giờ biết là có sự lựa chọn này, vì gần như mọi công cụ tạo UUID chỉ cung cấp v4.
Vì sao v4 không tốt khi làm khóa cơ sở dữ liệu?
Vì nó hoàn toàn ngẫu nhiên, trong khi chỉ mục cơ sở dữ liệu thì được sắp xếp. Các khóa ngẫu nhiên mới rơi vào những vị trí ngẫu nhiên trong chỉ mục, nên mỗi lần chèn chạm vào một trang khác nhau, bộ nhớ đệm không còn tác dụng, và chỉ mục bị phân mảnh và phình to. Trên một bảng lớn, nhiều truy cập, đây là sự chậm lại đo được và ngày càng tệ theo thời gian. Đây không phải mối lo lý thuyết — đó là lý do tài liệu của cả Postgres lẫn MySQL giờ đều bàn đến nó.
UUID v7 là gì?
Là UUID có 48 bit đầu là dấu thời gian tính bằng mili giây, theo sau là dữ liệu ngẫu nhiên. Nó vẫn là duy nhất toàn cục và vẫn dài 128 bit, nhưng vì thời gian đứng đầu, các UUID v7 sắp xếp theo đúng thứ tự được tạo. Khóa mới được nối vào cuối chỉ mục thay vì rải rác khắp nơi, đúng như cách một số nguyên tự tăng hoạt động — nhưng có tính duy nhất của UUID. Nó được chuẩn hóa trong RFC 9562 năm 2024 và là khuyến nghị hiện tại cho các bảng mới.
UUID v7 ở đây có thực sự sắp xếp đúng không?
Có, kể cả trong cùng một mili giây, đó là phần mà hầu hết các cách triển khai làm sai. Dấu thời gian chỉ có độ phân giải mili giây, nên tạo một nghìn ID trong một vòng lặp sẽ xong trong vòng một mili giây — và nếu các bit thấp hoàn toàn ngẫu nhiên thì một nghìn ID đó KHÔNG sắp xếp theo thứ tự được tạo. Công cụ này dùng bộ đếm đơn điệu được mô tả trong RFC 9562, nên một loạt UUID luôn tăng dần nghiêm ngặt, lần nào cũng vậy. Hãy tạo một nghìn cái rồi sắp xếp; chúng sẽ trở về đúng thứ tự đã được tạo.
UUID v7 có an toàn để công khai không?
Có, với một điều cần lưu ý: theo thiết kế, nó tiết lộ thời điểm được tạo, chính xác đến mili giây. Với khóa cơ sở dữ liệu, điều đó thường vô hại hoặc thậm chí hữu ích. Nhưng nếu bản thân thời điểm tạo là thông tin nhạy cảm, hoặc nếu bạn cần định danh không thể đoán được, hãy dùng v4 — v7 vẫn có 74 bit ngẫu nhiên, rất nhiều, nhưng dấu thời gian của nó thì ai có ID cũng đọc được rõ ràng.
Chúng có đủ ngẫu nhiên để an toàn không?
Có. Tính ngẫu nhiên đến từ `crypto.getRandomValues`, bộ tạo số ngẫu nhiên an toàn về mật mã của trình duyệt, không bao giờ từ `Math.random`. Sự khác biệt đó đã gây ra những lỗ hổng thật: `Math.random` nhanh nhưng dễ đoán, và token phiên đăng nhập dựa trên nó đã từng bị đoán ra trong thực tế. UUID v4 có 122 bit ngẫu nhiên, đủ để việc trùng lặp không phải là mối lo thực tế.
Chúng có được tạo ngay trên thiết bị của tôi không?
Có, hoàn toàn, và với định danh thì điều đó quan trọng. Một UUID lấy từ máy chủ của người khác là một UUID mà người khác đã nhìn thấy — điều làm mất ý nghĩa nếu bạn đang tạo một bí mật. Những UUID này không bao giờ rời khỏi trình duyệt của bạn. Sau khi trang tải xong, hãy tắt Wi-Fi và nó vẫn hoạt động y như cũ. Đó là cách đơn giản nhất để tự mình xác nhận lời cam kết về quyền riêng tư thay vì chỉ tin lời chúng tôi.
UUID nil là gì?
Toàn số 0: 00000000-0000-0000-0000-000000000000. Đó là một UUID hợp lệ, được dành riêng, dùng để biểu thị “không có” hoặc “chưa đặt” khi không thể dùng null. Ngược lại với nó, UUID max gồm toàn chữ f, đôi khi được dùng làm giá trị chặn khi sắp xếp. Cả hai đều có ở đây vì thỉnh thoảng bạn cần đến chúng và gõ đúng thì khá phiền.
Nên biết: UUID phiên bản 4 lấy từ nguồn ngẫu nhiên mật mã của trình duyệt, không phải Math.random, nên an toàn để dùng làm định danh. Phiên bản 7 chứa dấu thời gian tính bằng mili giây, đó là điều giúp nó sắp xếp tốt — và cũng có nghĩa nó để lộ thời điểm tạo ra nó. Đừng dùng v7 khi điều đó quan trọng.
Đặt công cụ này lên website của bạn
Miễn phí cho mọi blog, trang lớp học hay bài viết hướng dẫn. Chỉ cần dán một đoạn mã là khách truy cập có thể dùng ngay trên trang của bạn.