Adakah yang melakukan penelitian nyata tentang kemungkinan tabrakan UUID, terutama dengan UUID versi 4 (acak), mengingat bahwa generator angka acak yang kami gunakan tidak benar-benar acak dan bahwa kami mungkin memiliki lusinan atau ratusan mesin identik yang menjalankan kode yang sama menghasilkan UUID?
Rekan kerja saya menganggap pengujian tabrakan UUID sebagai pemborosan waktu, tetapi saya selalu memasukkan kode untuk menangkap pengecualian kunci duplikat dari database dan mencoba lagi dengan UUID baru. Tapi itu tidak akan menyelesaikan masalah jika UUID berasal dari proses lain dan merujuk ke objek nyata.
NEWID()
fungsi tidak acak? Jika demikian, apakah Anda memiliki sumber untuk mendukung klaim tersebut? Outputnya jelas terlihat seperti UU4 v4 bagi saya.NEWSEQUENTIALID()
Jelas tidak sepenuhnya acak, tapi itu tujuannya : untuk menghasilkan UUID yang berfungsi dengan baik (serta UUID dapat, setidaknya) sebagai kunci indeks.Jawaban:
Wikipedia memiliki beberapa detail:
http://en.wikipedia.org/wiki/Universally_unique_identifier
http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates
Tetapi probabilitas hanya berlaku jika bitnya acak sempurna. Namun, RFC http://tools.ietf.org/html/rfc4122#halaman 14 yang ditautkan dalam jawaban lain mendefinisikan ini untuk versi 4:
Ini cukup banyak memungkinkan apa saja dari generator acak xkcd http://xkcd.com/221/ ke perangkat keras menggunakan kebisingan kuantum. Pertimbangan keamanan dalam RFC:
Saya membaca ini sebagai: Anda sendirian. Anda bertanggung jawab untuk generator acak Anda dalam aplikasi Anda sendiri, tetapi ini dan yang lainnya didasarkan pada kepercayaan. Jika Anda tidak mempercayai kemampuan Anda sendiri untuk memahami dan menggunakan generator acak pilihan Anda dengan benar, maka memang ide yang bagus untuk memeriksa tabrakan. Jika Anda tidak mempercayai programmer dari proses lain, maka periksa tabrakan atau gunakan versi UUID yang berbeda.
sumber
Anda tentu harus mendeteksi jika terjadi tabrakan, dan aplikasi Anda harus mengeluarkan pengecualian jika itu terjadi. Misalnya jika UUID digunakan sebagai kunci utama dalam basis data, maka basis data tersebut akan menimbulkan kesalahan saat memasukkan ID yang bertabrakan.
Namun, saya akan percaya bahwa menulis kode untuk menghasilkan UUID baru dalam kasus tabrakan dan mencoba lagi menjadi buang-buang waktu. Peluang terjadinya tabrakan sangat kecil sehingga melemparkan pengecualian akan menjadi cara yang masuk akal untuk menghadapinya.
Ingat, ini tidak hanya membuang-buang waktu Anda sendiri menulis kode, tetapi juga membuat kode lebih kompleks, sehingga lebih sulit bagi orang berikutnya untuk membaca, karena hampir tidak ada keuntungan sama sekali.
sumber
Ini pertanyaan yang sangat bagus. Saya tidak percaya itu dianggap cukup terburu-buru untuk menggunakan UUID di mana-mana. Saya belum menemukan penelitian yang solid.
Sebuah saran: injak dengan sangat hati-hati di sini, dan ketahui kriptografi Anda dengan baik. Jika Anda menggunakan UUID 128-bit, 'efek ulang tahun' memberi tahu kami bahwa kemungkinan tabrakan setelah Anda menghasilkan sekitar 2 ^ 64 kunci, asalkan Anda memiliki 128 bit entropi di setiap kunci .
Sebenarnya agak sulit untuk memastikan bahwa inilah masalahnya. Keacakan yang sebenarnya dapat dihasilkan dari (a) peluruhan radioaktif (b) kebisingan radio latar belakang acak, sering terkontaminasi kecuali Anda berhati-hati (c) kebisingan elektronik yang dipilih dengan tepat, misalnya diambil dari dioda Zener yang bias balik. (Saya sudah bermain dengan yang terakhir, dan itu berfungsi seperti pesona, BTW).
Saya tidak akan mempercayai pernyataan seperti "Saya belum pernah melihat ini dalam satu tahun penggunaan", kecuali jika pengguna telah menghasilkan sesuatu yang mendekati 2 ^ 64 (mis. Sekitar 10 ^ 19) kunci, dan memeriksa semuanya terhadap satu sama lain, sebuah latihan non-sepele.
Masalahnya adalah ini. Katakanlah Anda hanya memiliki 100 bit entropi, ketika membandingkan kunci Anda dengan semua kunci lain yang dihasilkan orang lain di ruang kunci yang sama. Anda akan mulai melihat tabrakan di sekitar 2 ^ 50 yaitu. sekitar 10 ^ 15 kunci. Peluang Anda melihat tabrakan jika Anda telah mengisi basis data Anda dengan hanya 1000 miliar kunci masih dapat diabaikan. Dan jika Anda tidak memeriksa, nanti Anda akan mendapatkan kesalahan tak terduga yang merayap ke dalam database berukuran baris-peta Anda. Ini bisa menggigit keras.
Kenyataan bahwa ada beberapa pendekatan untuk menghasilkan UUID tersebut harus menimbulkan kekejangan sesaat. Ketika Anda menyadari bahwa beberapa generator menggunakan proses 'benar-benar acak' dengan entropi yang cukup untuk UUID tipe 4, Anda harus sangat khawatir kecuali Anda telah dengan cermat memeriksa konten entropi generator. (Kebanyakan orang tidak akan melakukan ini, atau bahkan tahu bagaimana caranya; Anda mungkin mulai dengan suite DieHarder). JANGAN mengacaukan pembuatan nomor pseudorandom dengan pembuatan nomor acak.
Sangat penting bagi Anda untuk menyadari bahwa entropi yang Anda masukkan adalah entropi yang Anda miliki, dan hanya mengganggu kunci dengan menerapkan fungsi kriptografi tidak mengubah entropi. Mungkin tidak jelas secara intuitif bahwa jika seluruh ruang saya terdiri dari angka 0 dan 1, konten entropi sama dengan dua string berikut, asalkan mereka satu-satunya dua pilihan: "Ini adalah string yang benar-benar sangat kompleks. 293290729382832 * ! @@ # & ^% $$), m} "dan" DAN SEKARANG UNTUK SESUATU YANG SANGAT BERBEDA ". Masih ada dua opsi.
Keacakan sulit untuk dilakukan dengan benar, dan hanya percaya bahwa "para ahli telah melihatnya, oleh karena itu tidak apa-apa" mungkin tidak cukup. Ahli kriptografi (dan ada beberapa di antaranya yang benar-benar cakap) adalah orang pertama yang mengakui bahwa mereka sering keliru. Kami memercayai hati, DigiNotar, dll.
Saya pikir Paul Tomblin sedang berhati-hati. 2c saya
sumber
Masalah yang Anda miliki adalah bahwa jika Anda menggunakan "generator angka acak" dan Anda tidak tahu seberapa acak generator itu, maka kemungkinan tabrakan sebenarnya tidak diketahui. Jika generator angka acak berkorelasi dalam beberapa cara, kemungkinan tabrakan dapat meningkat secara dramatis - mungkin banyak, banyak pesanan atau besarnya.
Bahkan jika Anda memiliki probabilitas tabrakan yang sangat kecil, Anda memiliki masalah mendasar: Probabilitasnya adalah TIDAK 0. Ini berarti bahwa tabrakan AKAN akhirnya akan terjadi, mereka tidak akan sering terjadi.
Semakin sering Anda menghasilkan dan menggunakan UUID semakin cepat bahwa tabrakan cenderung terlihat. (menghasilkan 1 per tahun berarti waktu tunggu yang lebih lama daripada menghasilkan satu juta per detik, semua hal lain dianggap sama).
Jika probabilitas itu terbatas, tidak diketahui, dan Anda menggunakan banyak UUID maka Anda perlu mempertimbangkan konsekuensi dari tabrakan. Jika tidak bisa melempar pengecualian dan mematikan aplikasi bisnis, maka jangan lakukan itu! (Contoh di atas kepala saya: "Tidak apa-apa untuk mematikan server web di tengah memperbarui checkin perpustakaan ... itu tidak akan sering terjadi" dan "Tidak apa-apa untuk mematikan sistem penggajian di tengah-tengah melakukan pay run ". Keputusan ini mungkin merupakan langkah yang membatasi karier.)
Anda mungkin memiliki kasus yang lebih buruk, sekali lagi tergantung pada aplikasi Anda. Jika Anda menguji keberadaan UUID (yaitu, melakukan pencarian) dan kemudian membuat yang baru jika belum ada - yang merupakan hal yang cukup umum untuk dilakukan - maka Anda mungkin menemukan Anda sedang menghubungkan catatan atau membuat hubungan , padahal sebenarnya Anda sedang menghubungkan 2 hal melalui UUID yang seharusnya tidak terhubung. Ini adalah sesuatu di mana melempar pengecualian tidak akan menyelesaikan apa pun dan Anda memiliki kekacauan yang tidak terdeteksi dibuat di suatu tempat. Ini adalah jenis hal yang menyebabkan kebocoran informasi dan bisa sangat memalukan. (mis: Masuk ke bank Anda dan temukan Anda dapat melihat saldo akun orang lain! Buruk!)
Ringkasan: Anda perlu mempertimbangkan cara UUID Anda digunakan, dan konsekuensi dari tabrakan. Ini menentukan apakah Anda harus berhati-hati untuk mendeteksi dan menghindari tabrakan, mengambil tindakan sederhana jika terjadi tabrakan, atau tidak melakukan apa pun. Solusi sederhana, tunggal, satu-untuk-semua, cenderung tidak sesuai dalam beberapa keadaan.
sumber
Ada dua masalah yang terlibat:
Kualitas generator nomor acak yang digunakan.
Jumlah UUID yang mungkin dihasilkan.
UUID "acak" memiliki 122 bit acak. Dengan asumsi keacakan sempurna, Anda dapat mengharapkan tumbukan pertama sekitar 2 ^ 61 dihasilkan UUIDs (itu akar kuadrat dari 2 ^ 122). Jika semua orang di dunia ini menghasilkan UUID per detik, itu 10.000.000.000 * 365 * 24 * 60 * 60 = 315360000000000000000 UUID per tahun, yang cukup dekat dengan 2 ^ 58. Artinya, setelah beberapa tahun Anda akan mendapatkan tabrakan pertama. Kecuali jika aplikasi Anda mendekati angka-angka itu, Anda dapat yakin bahwa Anda tidak akan mendapatkan tabrakan jika generator acak Anda memiliki kualitas yang baik.
Berbicara tentang generator bilangan acak: Jika Anda menggunakan generator perpustakaan C standar (langsung, tidak langsung, atau generator serupa), mungkin menaburinya dengan waktu, Anda akan dilewati. Ini tidak bisa menarik cukup entropi untuk menghindari tabrakan. Namun, jika Anda menggunakan linux, cukup baca 16 byte data dari
/dev/urandom
: Ini mengacu pada kumpulan entropi yang diaduk oleh kernel, yang memiliki akses ke beberapa peristiwa acak nyata. Kecuali Anda biasanya menghasilkan UUID benar-benar, sangat awal dalam urutan boot,/dev/urandom
harus berperilaku seperti sumber acak yang sebenarnya.sumber
Saya sudah mengujinya sekali menggunakan program (brute force) yang cukup sederhana yang menghasilkan 10 juta UUID-s dan saya belum pernah mengalami tabrakan.
The UUID RFC mengatakan bahwa UUID tidak hanya sekelompok (semu) nomor acak.
sumber