Saya mengerti perbedaan antara keduanya dari dokumen.
uuid1()
:
Hasilkan UUID dari ID host, nomor urut, dan waktu saat ini
uuid4()
:
Hasilkan UUID acak.
Jadi uuid1
gunakan info mesin / urutan / waktu untuk menghasilkan UUID. Apa pro dan kontra dari penggunaan masing-masing?
Saya tahu uuid1()
dapat memiliki masalah privasi, karena didasarkan pada informasi mesin. Saya ingin tahu apakah ada yang lebih halus ketika memilih satu atau yang lain. Saya hanya menggunakan uuid4()
sekarang, karena ini adalah UUID yang sepenuhnya acak. Tapi saya bertanya-tanya apakah saya harus menggunakan uuid1
untuk mengurangi risiko tabrakan.
Pada dasarnya, saya mencari tips orang untuk praktik terbaik dalam menggunakan satu vs yang lain. Terima kasih!
Jawaban:
uuid1()
dijamin tidak menghasilkan tabrakan (dengan asumsi Anda tidak membuat terlalu banyak tabrakan secara bersamaan). Saya tidak akan menggunakannya jika penting bahwa tidak ada koneksi antarauuid
dan komputer, karena alamat mac terbiasa membuatnya unik di seluruh komputer.Anda dapat membuat duplikat dengan membuat lebih dari 2 14 uuid1 dalam waktu kurang dari 100ns, tetapi ini bukan masalah bagi kebanyakan kasus penggunaan.
uuid4()
menghasilkan, seperti yang Anda katakan, UUID acak. Peluang tabrakan benar-benar, sangat, sangat kecil. Cukup kecil, sehingga Anda tidak perlu khawatir. Masalahnya adalah, bahwa generator nomor acak yang buruk membuatnya lebih cenderung mengalami tabrakan.Jawaban luar biasa dari Bob Aman ini merangkumnya dengan baik. (Saya sarankan membaca seluruh jawaban.)
sumber
uuid1
belum tentu menghasilkan UUID unik jika Anda menghasilkan beberapa per detik pada simpul yang sama. Contoh:[uuid.uuid1() for i in range(2)]
. Kecuali tentu saja sesuatu yang aneh sedang terjadi yang saya lewatkan.uuid1
memiliki nomor urut (elemen ke-4 dalam contoh Anda), jadi kecuali Anda menggunakan semua bit di konter Anda tidak memiliki tabrakan.Satu contoh ketika Anda dapat mempertimbangkan
uuid1()
bukanuuid4()
adalah ketika UUIDs diproduksi pada mesin yang terpisah , misalnya ketika beberapa transaksi online yang proses pada beberapa mesin untuk skala tujuan.Dalam situasi seperti itu, risiko tabrakan karena pilihan yang buruk dalam cara generator nomor pseudo-acak diinisialisasi, misalnya, dan juga jumlah UUID yang berpotensi lebih tinggi menghasilkan memberikan kemungkinan yang lebih besar untuk membuat duplikat ID.
Minat lain dari
uuid1()
, dalam hal ini adalah bahwa mesin di mana setiap GUID awalnya diproduksi secara implisit dicatat (di bagian "simpul" UUID). Ini dan info waktu, dapat membantu jika hanya dengan debugging.sumber
Tim saya baru saja mengalami masalah menggunakan UUID1 untuk skrip pemutakhiran basis data tempat kami membuat ~ 120k UUID dalam beberapa menit. Tabrakan UUID menyebabkan pelanggaran batasan kunci primer.
Kami telah memutakhirkan 100-an server tetapi pada contoh Amazon EC2 kami beberapa kali mengalami masalah ini. Saya menduga resolusi clock yang buruk dan beralih ke UUID4 menyelesaikannya untuk kami.
sumber
Satu hal yang perlu diperhatikan saat menggunakan
uuid1
, jika Anda menggunakan panggilan default (tanpa memberikanclock_seq
parameter), Anda memiliki peluang mengalami tabrakan: Anda hanya memiliki 14 bit keacakan (menghasilkan 18 entri dalam 100ns memberi Anda sekitar 1% peluang tabrakan lihat paradoks ulang tahun / serangan). Masalahnya tidak akan pernah terjadi pada kebanyakan kasus penggunaan, tetapi pada mesin virtual dengan resolusi clock yang buruk itu akan menggigit Anda.sumber
clock_seq
....Mungkin sesuatu yang tidak disebutkan adalah lokalitas.
Alamat MAC atau pemesanan berbasis waktu (UUID1) dapat meningkatkan kinerja basis data, karena lebih sulit untuk menyortir angka lebih dekat daripada yang didistribusikan secara acak (UUID4) (lihat di sini ).
Masalah kedua yang terkait, adalah bahwa menggunakan UUID1 dapat berguna dalam debugging, bahkan jika data asal hilang atau tidak disimpan secara eksplisit (ini jelas bertentangan dengan masalah privasi yang disebutkan oleh OP).
sumber
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:
(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.sumber