Versi UUID mana yang digunakan?

332

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.

pengguna1802143
sumber
2
Apa pilihanmu?
Gabe
Apa pun yang bekerja dengan python. Jadi saya kira ini docs.python.org/2/library/uuid.html . 1,3,4,5.
user1802143
Jika Anda ingin tahu tentang Versi 3 & 5, lihat Pertanyaan ini, Menghasilkan UUID v5. Apa itu nama dan namespace? .
Basil Bourque

Jawaban:

414

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.

Gabe
sumber
17
Saya akan menambahkan: Jika Anda perlu membuat reproducibleUUID 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.
anregen
3
Dalam lingkungan komputasi awan (seperti AWS atau GAE), kelihatannya kelemahan Versi 1 dikurangi menjadi terlupakan. Di mana ada kemungkinan ribuan alamat MAC berbeda diterapkan pada generator UUID aplikasi tertentu dari waktu ke waktu, menghilangkan prediktabilitas dan / atau keterlacakan.
Buffalo Rabor
3
@ user239558 Mengingat tujuan UUID adalah keunikannya, UUIDv5 masih bisa lebih disukai.
Epicurist
7
Komentar tentang Versi 1 yang "tidak direkomendasikan", terlalu sederhana. Dalam banyak situasi, ini memang baik dan disukai. Tetapi jika Anda memiliki kekhawatiran keamanan tentang membocorkan salah satu item informasi ini dari UUID yang mungkin tersedia untuk aktor yang tidak dapat dipercaya: (a) alamat MAC dari mesin yang membuat UUID, atau (b) tanggal-waktu saat dibuat, kemudian hindari Versi 1. Jika kedua informasi tersebut tidak sensitif, maka Versi 1 adalah cara terbaik.
Basil Bourque
9
Apa yang terjadi pada versi 2?
Matthew Woo
53

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)
anregen
sumber
67
Anda tidak akan melihat dua implementasi UUID versi 4 bertabrakan, kecuali jika Anda menghasilkan satu miliar UUID setiap detik selama satu abad dan memenangkan koin balik . Ingat, set_sizeadalah 2 ^ 122, yang sangat besar .
Kevin
8
Algoritma V4 bukan serial, artinya ada kemungkinan dua UUID pertama yang dihasilkan oleh v4 bisa cocok. Hanya karena ada banyak opsi, tidak berarti Anda harus kehabisan opsi unik sebelum Anda akan menghasilkan pengulangan. Itu bisa terjadi kapan saja.
anregen
7
Anda gagal untuk benar-benar melakukan perhitungan. Kami (sebagai spesies) tidak menghasilkan 1 miliar UUID setiap detik. Jadi kita memiliki lebih dari 100 tahun hingga tabrakan pertama (rata-rata).
Kevin
31
V4 "mungkin" bertabrakan, tetapi probabilitasnya sangat rendah sehingga bagi kebanyakan kasus penggunaan nilainya risikonya. Re: "dua mesin di dunia akhirnya menciptakan 'UUID'v4" yang sama, ya, tapi ini bukan masalah karena sebagian besar mesin di dunia yang menggunakan UUID menggunakannya dalam konteks yang berbeda. Maksud saya, jika saya membuat UUID yang sama untuk aplikasi internal saya sendiri seperti yang Anda lakukan untuk aplikasi internal Anda, maka itu tidak masalah. Tabrakan hanya penting jika terjadi dalam konteks yang sama. (ingat, bahkan di dalam suatu aplikasi, banyak UUID tidak harus unik di seluruh aplikasi, hanya konteksnya yang digunakan)
6
Jadi kedengarannya seperti, jika Anda tidak membutuhkan Panduan Anda untuk aman, gunakan versi 1. Jika Anda membutuhkannya aman, dan merasa beruntung (atau benar-benar, jangan merasa sial) gunakan versi 4.
Vaccano
16

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.

Nik Bougalis
sumber
4
Saya kira itu karena OP tidak bertanya: bagaimana cara "membuat kode algoritma pembuatan UUID [saya] sendiri alih-alih memanggil fungsi pembuatan UUID yang disediakan oleh sebagian besar sistem operasi modern?"
anregen
Selain itu, saya pikir ini adalah penjelasan yang baik dari UUIDv3 dan v5. Lihat jawaban saya di bawah tentang mengapa saya pikir v1 bisa menjadi pilihan yang baik.
anregen
apa itu NAMESPACE_URL? itu variabel yang bisa saya dapatkan? dari mana?
stackdave
@stackdave NAMESPACE_URLadalah UUID yang biasanya sama dengan 6ba7b811-9dad-11d1-80b4-00c04fd430c8, mengikuti rekomendasi yang dibuat pada halaman 30 dari RFC-4122 .
Jamie Ridding
2

Dokumentasi Postgres menggambarkan perbedaan antara UUIDs. 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.

Eugen Konkov
sumber