Versi UUID mana yang harus Anda gunakan? Saya melihat banyak utas menjelaskan apa yang diperlukan setiap versi, tetapi saya mengalami kesulitan mencari tahu apa yang terbaik untuk aplikasi apa.
Versi UUID mana yang harus Anda gunakan? Saya melihat banyak utas menjelaskan apa yang diperlukan setiap versi, tetapi saya mengalami kesulitan mencari tahu apa yang terbaik untuk aplikasi apa.
Jawaban:
Ada dua cara berbeda untuk menghasilkan UUID.
Jika Anda hanya memerlukan ID unik, Anda ingin versi 1 atau versi 4.
Versi 1: Ini menghasilkan ID unik berdasarkan alamat MAC kartu jaringan dan timer. ID ini mudah diprediksi (diberikan satu, saya mungkin bisa menebak yang lain) dan dapat ditelusuri kembali ke kartu jaringan Anda. Tidak disarankan untuk membuatnya.
Versi 4: Ini dihasilkan dari angka acak (atau pseudo-acak). Jika Anda hanya perlu membuat UUID, ini mungkin yang Anda inginkan.
Jika Anda harus selalu menghasilkan UUID yang sama dari nama yang diberikan, Anda ingin versi 3 atau versi 5.
Versi 3: Ini menghasilkan ID unik dari hash MD5 dari namespace dan nama. Jika Anda membutuhkan kompatibilitas mundur (dengan sistem lain yang menghasilkan UUID dari nama), gunakan ini.
Versi 5: Ini menghasilkan ID unik dari hash SHA-1 dari namespace dan nama. Ini adalah versi yang disukai.
reproducible
UUID dari nama yang diberikan, Anda ingin versi 3 atau versi 5. Jika Anda memberi makan algoritma yang sama input, itu akan menghasilkan output yang sama.
Jika Anda ingin nomor acak, gunakan perpustakaan nomor acak. Jika Anda ingin pengidentifikasi unik dengan efektif 0,00 ... lebih banyak 0s di sini ... 001% kemungkinan tabrakan, Anda harus menggunakan UUIDv1. Lihat posting Nick untuk UUIDv3 dan v5.
UUIDv1 TIDAK aman. Tidak seharusnya begitu. Ini dimaksudkan untuk menjadi UNIK, tidak bisa ditebak. UUIDv1 menggunakan timestamp saat ini, ditambah pengenal mesin, ditambah beberapa hal acak-ish untuk membuat angka yang tidak akan pernah dihasilkan oleh algoritma itu lagi. Ini sesuai untuk ID transaksi (bahkan jika semua orang melakukan jutaan transaksi).
Sejujurnya, saya tidak mengerti mengapa UUIDv4 ada ... dari membaca RFC4122 , sepertinya versi itu TIDAK menghilangkan kemungkinan tabrakan. Ini hanya generator bilangan acak. Jika itu benar, maka Anda memiliki peluang yang sangat BAIK dari dua mesin di dunia yang pada akhirnya menciptakan "UUID" v4 yang sama (kutipan karena tidak ada mekanisme untuk menjamin U.niversal U.niqueness). Dalam situasi itu, saya tidak berpikir bahwa algoritma termasuk dalam RFC yang menggambarkan metode untuk menghasilkan nilai-nilai unik. Itu akan termasuk dalam RFC tentang menghasilkan keacakan. Untuk satu set angka acak:
chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)
set_size
adalah 2 ^ 122, yang sangat besar .
Itu pertanyaan yang sangat umum. Satu jawaban adalah: "itu tergantung pada UUID apa yang ingin Anda hasilkan". Tetapi yang lebih baik adalah ini: "Nah, sebelum saya menjawab, dapatkah Anda memberi tahu kami mengapa Anda perlu membuat kode algoritme pembuatan UUID Anda sendiri alih-alih memanggil fungsi pembuatan UUID yang disediakan oleh sebagian besar sistem operasi modern?"
Melakukan itu lebih mudah dan lebih aman, dan karena Anda mungkin tidak perlu membuat sendiri, mengapa repot-repot menyusun implementasi? Dalam hal ini, jawabannya menjadi penggunaan apa pun yang diberikan O / S, bahasa pemrograman, atau kerangka kerja Anda. Misalnya, di Windows, ada CoCreateGuid atau UuidCreate atau salah satu dari berbagai pembungkus yang tersedia dari berbagai kerangka kerja yang digunakan. Di Linux ada uuid_generate .
Jika Anda, untuk beberapa alasan, benar-benar perlu membuat sendiri, maka setidaknya memiliki akal sehat untuk menjauh dari menghasilkan UUID v1 dan v2. Sulit untuk memperbaikinya. Tetap, sebagai gantinya, ke UUID v3, v4 atau v5.
Pembaruan : Dalam komentar, Anda menyebutkan bahwa Anda menggunakan Python dan tautan ke ini . Melihat melalui antarmuka yang disediakan, opsi termudah bagi Anda adalah membuat UUID v4 (yaitu, yang dibuat dari data acak) dengan memanggil uuid.uuid4()
.
Jika Anda memiliki beberapa data yang Anda perlu (atau bisa) hash untuk menghasilkan UUID, maka Anda dapat menggunakan v3 (yang bergantung pada MD5) atau v5 (yang bergantung pada SHA1). Membuat UUID v3 atau v5 sederhana: pertama-tama pilih jenis UUID yang ingin Anda hasilkan (Anda mungkin harus memilih v5) dan kemudian pilih namespace yang sesuai dan panggil fungsi dengan data yang ingin Anda gunakan untuk menghasilkan UUID dari. Misalnya, jika Anda membuat URL, Anda akan menggunakan NAMESPACE_URL
:
uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')
Harap perhatikan bahwa UUID ini akan berbeda dari UUID v5 untuk URL yang sama, yang dihasilkan seperti ini:
uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')
Properti yang bagus dari URL v3 dan v5 adalah bahwa mereka harus dapat dioperasikan antar implementasi. Dengan kata lain, jika dua sistem yang berbeda menggunakan implementasi yang sesuai dengan RFC4122, mereka akan (atau setidaknya harus ) keduanya menghasilkan UUID yang sama jika semua hal lainnya sama (yaitu menghasilkan versi UUID yang sama, dengan namespace yang sama dan data yang sama). Properti ini bisa sangat membantu dalam beberapa situasi (terutama dalam skenario penyimpanan konten-addressable), tetapi mungkin tidak dalam kasus khusus Anda.
NAMESPACE_URL
adalah UUID yang biasanya sama dengan 6ba7b811-9dad-11d1-80b4-00c04fd430c8
, mengikuti rekomendasi yang dibuat pada halaman 30 dari RFC-4122 .
Dokumentasi Postgres menggambarkan perbedaan antara UUID
s. Beberapa dari mereka:
V3:
uuid_generate_v3(namespace uuid, name text)
- Fungsi ini menghasilkan UUID versi 3 di namespace yang diberikan menggunakan nama input yang ditentukan.
V4:
uuid_generate_v4
- Fungsi ini menghasilkan UUID versi 4, yang seluruhnya berasal dari angka acak.