Ngoài câu trả lời được chấp nhận, có một tùy chọn thứ ba có thể hữu ích trong một số trường hợp:
v1 với MAC ngẫu nhiên ("v1mc")
Bạn có thể tạo kết hợp giữa v1 & v4 bằng cách cố tình tạo UUID v1 với địa chỉ MAC phát ngẫu nhiên (điều này được cho phép bởi thông số v1). UUID v1 kết quả phụ thuộc vào thời gian (như v1 thông thường), nhưng thiếu tất cả thông tin cụ thể của máy chủ (như v4). Nó cũng gần với v4 hơn trong khả năng chống va chạm: v1mc = 60 bit thời gian + 61 bit ngẫu nhiên = 121 bit duy nhất; v4 = 122 bit ngẫu nhiên.
Vị trí đầu tiên tôi gặp phải là hàm uuid_generate_v1mc () của Postgres . Kể từ khi tôi sử dụng python tương đương:
from os import urandom
from uuid import uuid1
_int_from_bytes = int.from_bytes # py3 only
def uuid1mc():
# NOTE: The constant here is required by the UUIDv1 spec...
return uuid1(_int_from_bytes(urandom(6), "big") | 0x010000000000)
(lưu ý: Tôi đã có phiên bản dài hơn + nhanh hơn tạo trực tiếp đối tượng UUID; có thể đăng nếu có ai muốn)
Trong trường hợp khối lượng cuộc gọi LỚN / giây, điều này có khả năng làm cạn kiệt tính ngẫu nhiên của hệ thống. Bạn có thể sử dụng random
mô-đun stdlib thay thế (nó có thể cũng sẽ nhanh hơn). Nhưng ĐƯỢC CẢNH BÁO: chỉ mất vài trăm UUID trước khi kẻ tấn công có thể xác định trạng thái RNG, và do đó dự đoán một phần UUID trong tương lai.
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)