Sinh UUID phiên bản 4: cấu trúc, xác suất trùng và nơi nên hoặc không nên dùng
Công cụ sinh hàng loạt mã định danh duy nhất theo định dạng UUID phiên bản 4, mỗi lần tối đa một trăm mã. Kết quả hiện thành danh sách đánh số, sao chép được từng dòng hoặc cả khối, phù hợp khi bạn cần mã giả lập để kiểm thử, cần khóa cho bản ghi mẫu hoặc cần một chuỗi định danh không đụng hàng.
Tính năng nổi bật
- Sinh UUID phiên bản 4 đúng định dạng 8-4-4-4-12 với ký tự phiên bản và ký tự biến thể chuẩn
- Chọn số lượng từ 1 tới 100 mã cho mỗi lần bấm tạo
- Danh sách kết quả đánh số thứ tự để dễ đối chiếu khi cần lấy đúng dòng
- Nút sao chép riêng cho từng mã, kèm dấu xác nhận sau khi sao chép thành công
- Nút sao chép tất cả, mỗi mã một dòng nên dán thẳng vào bảng tính hay tệp văn bản là dùng được
- Kết quả xuất ra chữ thường theo cách viết thông dụng nhất của UUID
- Bấm tạo lại là ra bộ mã mới hoàn toàn, không giữ lại bộ cũ
- Chạy ngay trong trình duyệt, không gọi máy chủ và không lưu bất cứ mã nào
Vì sao lập trình viên cần một mã định danh sinh tại chỗ
Cách đánh số truyền thống là để cơ sở dữ liệu tự tăng một số nguyên, nhưng cách đó buộc bạn phải ghi bản ghi xuống rồi mới biết định danh của nó. Khi hệ thống có nhiều nguồn ghi dữ liệu, khi ứng dụng phải làm việc ngoại tuyến rồi mới đồng bộ, hoặc khi bạn cần tạo một chuỗi phụ thuộc trước khi bất kỳ thứ gì được lưu, thì việc chờ cơ sở dữ liệu cấp số trở thành nút thắt. UUID giải quyết đúng chỗ đó: bất kỳ máy nào cũng sinh được ngay lập tức mà gần như không có nguy cơ trùng với mã do máy khác sinh, không cần hỏi ai và không cần khóa. Ngoài ra mã dạng số tự tăng còn để lộ thông tin không nên lộ, vì người ngoài nhìn hai đơn hàng cách nhau vài phút là ước lượng được lượng đơn của bạn trong khoảng thời gian đó. Với những trường hợp cần một chuỗi vô nghĩa với người ngoài, UUID là lựa chọn quen thuộc.
Lợi ích khi sử dụng
- Có ngay một trăm mã hợp lệ để nhồi dữ liệu mẫu mà không phải viết đoạn mã sinh riêng
- Định dạng đúng chuẩn nên các thư viện kiểm tra tính hợp lệ đều chấp nhận
- Sao chép cả khối theo dòng nên dán vào bảng tính hoặc câu lệnh chèn dữ liệu rất nhanh
- Không cần cài đặt hay chạy môi trường phát triển chỉ để lấy vài mã
- Không có tài khoản, không lưu lịch sử, nên các mã đã tạo không tồn tại ở đâu ngoài màn hình của bạn
Cách sinh và sử dụng UUID
- 1Nhập số lượng mã bạn cần vào ô số lượng, giá trị nhận từ 1 tới 100.
- 2Bấm nút tạo, toàn bộ danh sách hiện ra ngay bên dưới với số thứ tự ở đầu mỗi dòng.
- 3Bấm biểu tượng sao chép ở cuối dòng để lấy riêng một mã, hoặc bấm sao chép tất cả để lấy cả khối.
- 4Dán vào nơi cần dùng, lưu ý mỗi mã nằm trên một dòng khi bạn sao chép cả khối.
- 5Nếu cần thêm mã, bấm tạo lại, nhưng nhớ là danh sách cũ bị thay thế nên hãy sao chép trước.
Đọc hiểu 36 ký tự trong một UUID
Một UUID viết ra gồm 36 ký tự: 32 chữ số thập lục phân và 4 dấu gạch ngang, chia thành năm nhóm theo tỷ lệ tám, bốn, bốn, bốn và mười hai. Bên trong đó là 128 bit dữ liệu, nhưng không phải cả 128 bit đều ngẫu nhiên. Ký tự đầu tiên của nhóm thứ ba luôn là số 4, đây là số hiệu phiên bản cho biết mã được sinh bằng cách lấy ngẫu nhiên. Ký tự đầu tiên của nhóm thứ tư luôn là một trong bốn giá trị 8, 9, a hoặc b, đây là phần đánh dấu biến thể theo chuẩn hiện hành. Hai vị trí cố định đó chiếm sáu bit, nên phần thực sự ngẫu nhiên chỉ còn 122 bit. Biết điều này giúp bạn kiểm tra nhanh một chuỗi có phải UUID phiên bản 4 hay không: nhìn ký tự thứ mười lăm và ký tự thứ hai mươi trong chuỗi, nếu không phải số 4 và không thuộc nhóm 8, 9, a, b thì đó là phiên bản khác hoặc là chuỗi bịa.
Xác suất trùng nhau nhỏ tới mức nào
Với 122 bit ngẫu nhiên, không gian mã có khoảng năm nghìn tỷ tỷ tỷ giá trị khác nhau. Nhưng câu hỏi đúng không phải xác suất một mã mới trùng với một mã cụ thể đã có, mà là xác suất có bất kỳ cặp nào trùng trong cả tập, tức bài toán ngày sinh nhật quen thuộc. Theo cách tính đó, bạn phải sinh khoảng hai tỷ tỷ ba trăm nghìn tỷ mã, tương ứng hai mũ sáu mươi mốt, thì xác suất tồn tại một cặp trùng mới đạt khoảng năm mươi phần trăm. Đặt vào bối cảnh thực tế: một hệ thống sinh một triệu mã mỗi giây liên tục sẽ mất hơn bảy mươi nghìn năm mới chạm tới con số đó. Vì vậy trong mọi ứng dụng thông thường, bạn có thể coi UUID phiên bản 4 là duy nhất mà không cần cơ chế kiểm tra trùng. Điều kiện duy nhất là nguồn số ngẫu nhiên phải thực sự tốt, và đây chính là điểm cần lưu ý với công cụ chạy trên trình duyệt.
Không dùng mã sinh ở đây làm khóa bảo mật
Công cụ này sinh mã bằng hàm số ngẫu nhiên thông thường của JavaScript chứ không phải bằng nguồn ngẫu nhiên dành cho mật mã. Khác biệt rất quan trọng: hàm thông thường được thiết kế cho tốc độ và cho việc phân bố đều, nó chạy từ một trạng thái nội bộ và tạo ra dãy số có thể suy đoán được nếu ai đó nắm được trạng thái ấy. Nghĩa là các mã sinh liên tiếp trong cùng một lượt không độc lập với nhau theo nghĩa mật mã. Hệ quả thực tế: tuyệt đối không dùng những mã này làm khóa phiên đăng nhập, mã đặt lại mật khẩu, khóa truy cập tệp hay bất kỳ chuỗi bí mật nào mà việc đoán trúng gây thiệt hại. Khi cần chuỗi bí mật, hãy dùng hàm sinh ngẫu nhiên dành cho mật mã có sẵn trong trình duyệt và trong các môi trường chạy phía máy chủ. Còn để làm định danh cho bản ghi, làm mã đơn hàng nội bộ hay làm dữ liệu kiểm thử thì mã ở đây hoàn toàn dùng được.
Các phiên bản UUID và khi nào phiên bản 4 không phải lựa chọn tốt nhất
Phiên bản 1 dựng mã từ dấu thời gian kết hợp với địa chỉ phần cứng của máy, nên nó sắp xếp được theo thời gian nhưng lại làm lộ thời điểm tạo và một phần thông tin về máy đã tạo. Phiên bản 4 lấy toàn bộ từ số ngẫu nhiên nên không lộ gì, đổi lại các mã sinh gần nhau về thời gian lại nằm rải rác khắp không gian giá trị. Phiên bản 7 là bổ sung mới trong bộ tiêu chuẩn, đặt dấu thời gian ở đầu rồi mới tới phần ngẫu nhiên, nhờ vậy các mã sinh sau luôn lớn hơn mã sinh trước khi so sánh theo thứ tự chuỗi. Sự khác biệt đó có ý nghĩa thật khi bạn dùng UUID làm khóa chính: chỉ mục của cơ sở dữ liệu được tổ chức theo thứ tự, nên chèn các giá trị ngẫu nhiên rải đều sẽ liên tục làm tách trang chỉ mục và khiến bảng lớn dần trở nên chậm. Với bảng ghi nhiều và tăng liên tục, phiên bản 7 thường là lựa chọn hợp lý hơn phiên bản 4.
Lưu UUID trong cơ sở dữ liệu sao cho không phí chỗ
Sai lầm phổ biến nhất là lưu UUID dưới dạng chuỗi 36 ký tự. Cách đó tốn 36 byte cho mỗi giá trị, trong khi bản chất chỉ là 128 bit tức 16 byte. Chênh lệch hơn gấp đôi nghe không lớn cho một bản ghi, nhưng khóa chính còn được nhân bản vào mọi chỉ mục phụ và vào mọi khóa ngoại của bảng khác, nên với hàng chục triệu dòng thì phần dôi ra rất đáng kể và nó nằm ngay trong bộ nhớ đệm quý giá của cơ sở dữ liệu. Cách đúng là dùng kiểu dữ liệu chuyên cho UUID nếu hệ quản trị có sẵn, hoặc lưu vào một trường nhị phân mười sáu byte rồi chuyển đổi ở tầng ứng dụng. Một lưu ý nữa là hãy thống nhất một kiểu chữ cho toàn hệ thống, thường là chữ thường, vì so sánh chuỗi thường phân biệt hoa thường và một mã viết hoa sẽ không khớp với chính nó viết thường trong các phép tra cứu.
Câu hỏi thường gặp (FAQ)
UUID phiên bản 4 khác các phiên bản khác ở chỗ nào?
Phiên bản 4 lấy gần như toàn bộ giá trị từ số ngẫu nhiên nên không mang thông tin về thời gian hay máy tạo ra nó. Phiên bản 1 dựng từ dấu thời gian và địa chỉ phần cứng nên sắp xếp được nhưng làm lộ thông tin. Phiên bản 7 đặt dấu thời gian ở đầu rồi mới tới phần ngẫu nhiên, vừa giữ được thứ tự vừa không lộ máy tạo.
Hai UUID có thể trùng nhau không?
Về lý thuyết là có, nhưng xác suất nhỏ tới mức không cần tính đến. Phần ngẫu nhiên chiếm 122 bit, và theo bài toán ngày sinh nhật thì phải sinh khoảng hai mũ sáu mươi mốt mã mới đạt xác suất năm mươi phần trăm có một cặp trùng. Một hệ thống sinh một triệu mã mỗi giây phải chạy hơn bảy mươi nghìn năm mới tới ngưỡng đó.
Dùng mã ở đây làm token đăng nhập hay mã đặt lại mật khẩu được không?
Không nên. Công cụ dùng hàm số ngẫu nhiên thông thường của JavaScript, vốn không được thiết kế cho mục đích mật mã và có thể suy đoán được nếu biết trạng thái bộ sinh. Với chuỗi bí mật, hãy dùng hàm sinh ngẫu nhiên dành cho mật mã có sẵn trong trình duyệt hoặc ở phía máy chủ.
Vì sao chữ số thứ mười lăm luôn là số 4?
Đó là vị trí đánh dấu phiên bản theo chuẩn UUID, và số 4 cho biết mã được sinh bằng cách lấy ngẫu nhiên. Tương tự, ký tự đầu của nhóm thứ tư luôn là 8, 9, a hoặc b để đánh dấu biến thể. Hai chỗ này cố định nên phần thực sự ngẫu nhiên chỉ còn 122 trong tổng số 128 bit.
Nên lưu UUID trong cơ sở dữ liệu ở kiểu dữ liệu nào?
Dùng kiểu chuyên cho UUID nếu hệ quản trị có sẵn, còn không thì lưu vào trường nhị phân mười sáu byte. Lưu dạng chuỗi 36 ký tự tốn hơn gấp đôi, và phần dôi ra bị nhân lên ở mọi chỉ mục và mọi khóa ngoại, khiến bảng lớn tiêu tốn nhiều bộ nhớ đệm hơn mức cần thiết.
Dùng UUID làm khóa chính có làm chậm cơ sở dữ liệu không?
Có thể, khi bảng rất lớn và ghi liên tục. Chỉ mục được sắp theo thứ tự nên chèn các giá trị ngẫu nhiên rải đều làm tách trang chỉ mục thường xuyên. Nếu đây là mối lo, hãy cân nhắc UUID phiên bản 7 vì các mã sinh sau luôn lớn hơn mã sinh trước, hoặc giữ khóa chính là số tự tăng và để UUID làm định danh công khai.
Sinh được nhiều hơn một trăm mã một lần không?
Không, ô số lượng giới hạn ở một trăm cho mỗi lần bấm. Cần nhiều hơn thì bấm tạo nhiều lần và sao chép sau mỗi lần, nhưng nhớ là danh sách cũ bị thay thế hoàn toàn khi bạn bấm lại. Nếu cần hàng nghìn mã, viết một vòng lặp ngắn ở môi trường phát triển sẽ tiện hơn.
UUID viết hoa và viết thường có khác nhau không?
Về giá trị thì không, vì chữ số thập lục phân không phân biệt hoa thường. Nhưng khi lưu và so sánh dưới dạng chuỗi thì phần lớn hệ thống phân biệt, nên cùng một mã viết hai kiểu sẽ không khớp nhau trong phép tra cứu. Hãy thống nhất một kiểu cho toàn hệ thống, thông thường là chữ thường.
Có nên dùng UUID trong đường dẫn hiển thị cho người dùng không?
Được nhưng cân nhắc. Ưu điểm là không lộ số lượng bản ghi và không cho người ngoài dò tuần tự sang bản ghi khác. Nhược điểm là ba mươi sáu ký tự vô nghĩa làm đường dẫn dài và không đọc được. Với trang cần thân thiện, cách phổ biến là dùng slug mô tả nội dung và giữ UUID ở tầng dữ liệu.
Các mã tôi vừa tạo có được lưu ở đâu không?
Không. Mã sinh ra trong bộ nhớ của tab hiện tại và biến mất khi bạn tải lại trang hoặc bấm tạo lại. Không có bước gửi lên máy chủ, không ghi vào bộ nhớ trình duyệt và không có lịch sử nào truy lại được. Hãy sao chép trước khi rời trang.
Làm sao kiểm tra một chuỗi có phải UUID hợp lệ không?
Kiểm tra ba điều: đúng 36 ký tự với dấu gạch ở vị trí thứ chín, mười bốn, mười chín và hai mươi bốn; mọi ký tự còn lại thuộc bảng thập lục phân; và ký tự thứ mười lăm là số hiệu phiên bản hợp lệ. Với phiên bản 4 thì ký tự đó là số 4 và ký tự thứ hai mươi thuộc nhóm 8, 9, a, b.
GUID và UUID có phải một không?
Về bản chất là cùng một thứ, GUID là tên gọi quen dùng trong hệ sinh thái của Microsoft còn UUID là tên trong tài liệu tiêu chuẩn. Khác biệt duy nhất đáng lưu ý là một số công cụ của Microsoft hiển thị mã trong cặp ngoặc nhọn và đôi khi sắp xếp byte theo thứ tự khác khi lưu ở dạng nhị phân.
Từ khóa liên quan
- tạo uuid online
- uuid generator
- sinh uuid v4
- uuid là gì
- guid generator online
- tạo mã định danh duy nhất
- uuid version 4
- uuid v7 là gì
- uuid làm khóa chính
- lưu uuid trong mysql
- so sánh uuid và auto increment
- xác suất trùng uuid
- cấu trúc uuid 36 ký tự
- tạo nhiều uuid cùng lúc
- uuid cho dữ liệu test
- kiểm tra uuid hợp lệ
- random uuid javascript
- crypto randomuuid
- uuid binary 16 byte
- công cụ tạo uuid miễn phí
