Selain jawaban yang diterima, ada opsi ketiga yang dapat berguna dalam beberapa kasus:
v1 dengan MAC acak ("v1mc")
Anda dapat membuat hibrida antara v1 & v4 dengan sengaja membuat UUID v1 dengan alamat MAC siaran acak (ini diizinkan oleh spesifikasi v1). UUID v1 yang dihasilkan bergantung pada waktu (seperti v1 reguler), tetapi tidak memiliki semua informasi khusus host (seperti v4). Ini juga jauh lebih dekat dengan v4 dalam resistansi tabrakan: v1mc = 60 bit waktu + 61 bit acak = 121 bit unik; v4 = 122 bit acak.
Tempat pertama yang saya temui adalah fungsi uuid_generate_v1mc () dari Postgres . Sejak itu saya menggunakan setara python berikut:
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)
(catatan: Saya memiliki versi yang lebih panjang + lebih cepat yang membuat objek UUID secara langsung; dapat memposting jika ada yang mau)
Dalam hal volume besar panggilan / detik, ini memiliki potensi untuk melenyapkan keacakan sistem. Anda bisa menggunakan random
modul stdlib sebagai gantinya (mungkin juga akan lebih cepat). Tetapi PERINGATAN: itu hanya membutuhkan beberapa ratus UUIDs sebelum seorang penyerang dapat menentukan negara RNG, dan dengan demikian sebagian memprediksi UUID masa depan.
import random
from uuid import uuid1
def uuid1mc_insecure():
return uuid1(random.getrandbits(48) | 0x010000000000)