Saya tidak begitu mengerti maksud UUID . Saya tahu kemungkinan tabrakan secara efektif nol , tetapi secara efektif nol bahkan tidak mendekati tidak mungkin.
Adakah yang bisa memberi contoh di mana Anda tidak punya pilihan selain menggunakan UUID? Dari semua penggunaan yang pernah saya lihat, saya bisa melihat desain alternatif tanpa UUID. Tentu desainnya mungkin sedikit lebih rumit, tetapi setidaknya tidak memiliki kemungkinan kegagalan yang tidak nol.
UUID berbau seperti variabel global bagi saya. Ada banyak cara variabel global membuat desain yang lebih sederhana, tapi itu hanya desain malas.
architecture
uuid
Pyrolistik
sumber
sumber
Jawaban:
Saya menulis generator / parser UUID untuk Ruby, jadi saya menganggap diri saya cukup mendapat informasi tentang subjek tersebut. Ada empat versi UUID utama:
Versi 4 UUID pada dasarnya hanya 16 byte keacakan yang ditarik dari generator nomor acak yang aman secara kriptografis, dengan beberapa bit-twiddling untuk mengidentifikasi versi dan varian UUID. Ini sangat tidak mungkin untuk bertabrakan, tetapi itu bisa terjadi jika PRNG digunakan atau jika Anda kebetulan memiliki keberuntungan yang sangat, sangat, sangat, sangat, sangat buruk.
UUID Versi 5 dan Versi 3 masing-masing menggunakan fungsi hash SHA1 dan MD5, untuk menggabungkan namespace dengan bagian data yang sudah unik untuk menghasilkan UUID. Ini akan, misalnya, memungkinkan Anda menghasilkan UUID dari URL. Tabrakan di sini hanya mungkin jika fungsi hash yang mendasarinya juga memiliki tabrakan.
UUID versi 1 adalah yang paling umum. Mereka menggunakan alamat MAC kartu jaringan (yang kecuali dipalsukan, harus unik), ditambah stempel waktu, ditambah bit-twiddling biasa untuk menghasilkan UUID. Dalam kasus mesin yang tidak memiliki alamat MAC, 6 node byte dihasilkan dengan generator nomor acak yang aman secara kriptografis. Jika dua UUID dibuat secara berurutan cukup cepat sehingga stempel waktu cocok dengan UUID sebelumnya, stempel waktu akan bertambah 1. Tabrakan seharusnya tidak terjadi kecuali salah satu hal berikut terjadi: Alamat MAC dipalsukan; Satu mesin yang menjalankan dua aplikasi penghasil UUID yang berbeda menghasilkan UUID pada saat yang sama; Dua mesin tanpa kartu jaringan atau tanpa akses tingkat pengguna ke alamat MAC diberi urutan node acak yang sama, dan menghasilkan UUID pada saat yang sama;
Secara realistis, tidak satu pun dari peristiwa ini terjadi secara tidak sengaja dalam satu ruang ID aplikasi. Kecuali Anda menerima ID pada, katakanlah, dalam skala luas Internet, atau dengan lingkungan tidak tepercaya di mana individu jahat mungkin dapat melakukan sesuatu yang buruk jika terjadi benturan ID, itu bukan sesuatu yang perlu Anda khawatirkan. Sangat penting untuk memahami bahwa jika Anda membuat versi 4 UUID yang sama seperti yang saya lakukan, dalam banyak kasus, itu tidak masalah. Saya telah membuat ID di ruang ID yang sama sekali berbeda dari Anda. Aplikasi saya tidak akan pernah tahu tentang tabrakan jadi tabrakan itu tidak masalah. Terus terang, dalam satu ruang aplikasi tanpa aktor jahat, kepunahan semua kehidupan di bumi akan terjadi jauh sebelum Anda bertabrakan, bahkan pada UUID versi 4, bahkan jika Anda '
Selain itu, 2 ^ 64 * 16 adalah 256 exabyte. Seperti halnya, Anda perlu menyimpan ID senilai 256 exabyte sebelum Anda memiliki peluang 50% dari benturan ID dalam satu ruang aplikasi.
sumber
uuid.raw
akan memberi Anda string byte. Thehash
Metode ini tidak berguna bagi Anda. Ini digunakan untuk tabel hash dan operasi perbandingan secara internal di dalam Ruby. Semua metode untuk mengonversi ke dan dari berbagai representasi UUID didefinisikan sebagai metode kelas dan harus diawali dengan"parse"
.Hal yang sangat sulit dilakukan UUID untuk Anda lakukan sebaliknya adalah mendapatkan pengenal unik tanpa harus berkonsultasi atau berkoordinasi dengan otoritas pusat . Masalah umum untuk bisa mendapatkan hal seperti itu tanpa semacam infrastruktur yang dikelola adalah masalah yang dipecahkan UUID.
Saya telah membaca bahwa menurut paradoks ulang tahun, kemungkinan tabrakan UUID terjadi adalah 50% setelah 2 ^ 64 UUID dibuat. Sekarang 2 ^ 64 adalah angka yang cukup besar, tetapi peluang tabrakan 50% tampaknya terlalu berisiko (misalnya, berapa banyak UUID yang perlu ada sebelum ada peluang tabrakan 5% - bahkan kemungkinan itu tampak terlalu besar) .
Masalah dengan analisis itu ada dua:
UUID tidak sepenuhnya acak - ada komponen utama UUID yang berbasis waktu dan / atau lokasi. Jadi agar memiliki peluang nyata untuk bertabrakan, UUID yang bertabrakan harus dibuat pada saat yang sama dari generator UUID yang berbeda. Saya akan mengatakan bahwa meskipun ada kemungkinan yang masuk akal bahwa beberapa UUID dapat dibuat pada saat yang sama, ada cukup banyak gunk lain (termasuk info lokasi atau bit acak) untuk membuat kemungkinan tabrakan antara set UUID yang sangat kecil ini hampir mustahil. .
tegasnya, UUID hanya perlu unik di antara serangkaian UUID lain yang dapat dibandingkan. Jika Anda membuat UUID untuk digunakan sebagai kunci database, tidak masalah jika di tempat lain di alam semesta alternatif yang jahat UUID yang sama digunakan untuk mengidentifikasi antarmuka COM. Sama seperti itu tidak akan menimbulkan kebingungan jika ada seseorang (atau sesuatu) lain bernama "Michael Burr" di Alpha-Centauri.
sumber
Semuanya memiliki kemungkinan gagal yang bukan nol. Saya akan berkonsentrasi pada masalah yang jauh lebih mungkin terjadi (yaitu hampir semua hal yang dapat Anda pikirkan) daripada benturan UUID
sumber
Penekanan pada "masuk akal" atau, seperti yang Anda katakan, "efektif": cukup baik adalah bagaimana dunia nyata bekerja. Jumlah pekerjaan komputasi yang terlibat dalam menutupi kesenjangan antara "unik secara praktis" dan "benar-benar unik" sangatlah besar. Keunikan adalah kurva dengan hasil yang semakin berkurang. Di beberapa titik di kurva itu, ada garis antara di mana "cukup unik" masih terjangkau, dan kemudian kami melengkung SANGAT curam. Biaya penambahan lebih banyak keunikan menjadi cukup besar. Keunikan yang tidak terbatas memiliki biaya yang tidak terbatas.
UUID / GUID, secara relatif, adalah cara komputasi yang cepat dan mudah untuk menghasilkan ID yang secara wajar dapat dianggap unik secara universal. Ini sangat penting dalam banyak sistem yang perlu mengintegrasikan data dari sistem yang sebelumnya tidak terhubung. Misalnya: jika Anda memiliki Sistem Manajemen Konten yang berjalan pada dua platform berbeda, tetapi pada titik tertentu perlu mengimpor konten dari satu sistem ke sistem lainnya. Anda tidak ingin ID berubah, jadi referensi Anda antara data dari sistem A tetap utuh, tetapi Anda tidak ingin ada benturan dengan data yang dibuat di sistem B. UUID menyelesaikan ini.
sumber
UUID tidak pernah mutlak diperlukan. Namun nyaman untuk memiliki standar di mana pengguna offline masing-masing dapat menghasilkan kunci untuk sesuatu dengan kemungkinan tabrakan yang sangat rendah.
Ini dapat membantu dalam resolusi replikasi database dll ...
Akan mudah bagi pengguna online untuk menghasilkan kunci unik untuk sesuatu tanpa overhead atau kemungkinan tabrakan, tetapi UUID bukan untuk itu.
Bagaimanapun, sebuah kata tentang kemungkinan tabrakan, diambil dari Wikipedia:
sumber
Contoh klasik adalah saat Anda mereplikasi antara dua database.
DB (A) memasukkan record dengan int ID 10 dan pada saat yang sama DB (B) membuat record dengan ID 10. Ini adalah collision.
Dengan UUID, hal ini tidak akan terjadi karena tidak cocok. (hampir pasti)
sumber
Ada juga kemungkinan bukan nol bahwa setiap partikel dalam tubuh Anda secara bersamaan akan menembus kursi yang Anda duduki dan Anda akan tiba-tiba mendapati diri Anda duduk di lantai.
Apa kamu khawatir tentang itu?
sumber
Saya memiliki skema untuk menghindari UUID. Siapkan server di suatu tempat dan miliki sehingga setiap kali beberapa perangkat lunak menginginkan pengenal unik universal, mereka menghubungi server itu dan memberikannya. Sederhana!
Kecuali bahwa ada beberapa masalah praktis yang nyata dengan ini, bahkan jika kita mengabaikan niat jahat. Secara khusus, server tersebut dapat gagal atau menjadi tidak dapat dijangkau dari bagian internet. Berurusan dengan kegagalan server membutuhkan replikasi, dan itu sangat sulit untuk dilakukan dengan benar (lihat literatur tentang algoritma Paxos tentang mengapa membangun konsensus itu canggung) dan juga sangat lambat. Selain itu, jika semua server tidak dapat dijangkau dari bagian tertentu dari 'net, tidak ada klien yang terhubung ke subnet tersebut yang dapat melakukan apa pun karena mereka semua akan menunggu ID baru.
Jadi ... gunakan algoritme probabilistik sederhana untuk menghasilkannya yang tidak mungkin gagal selama masa Bumi, atau (mendanai dan) membangun infrastruktur utama yang akan menjadi penerapan PITA dan sering mengalami kegagalan. Saya tahu yang mana yang akan saya pilih.
sumber
saya tidak mendapatkan semua pembicaraan tentang kemungkinan tabrakan. Saya tidak peduli tentang tabrakan. Saya peduli dengan kinerja.
https://dba.stackexchange.com/a/119129/33649
sumber
Jika Anda hanya melihat alternatifnya, misalnya untuk aplikasi database sederhana, harus menanyakan database setiap kali sebelum Anda membuat objek baru, Anda akan segera menemukan bahwa menggunakan UUID secara efektif dapat mengurangi kompleksitas sistem Anda. Diberikan - jika Anda menggunakan kunci int are 32bit, yang akan disimpan dalam seperempat dari 128bit UUID. Diberikan - Algoritme pembuatan UUID membutuhkan lebih banyak daya komputasi daripada sekadar menaikkan angka. Tapi siapa peduli? Overhead mengelola "otoritas" untuk menetapkan nomor unik dengan mudah melebihi urutan besarnya, tergantung pada ruang ID keunikan yang Anda inginkan.
sumber
Pada UUID == desain malas
Saya tidak setuju ini tentang memilih perkelahian Anda. Jika UUID duplikat secara statistik tidak mungkin dan matematika terbukti, lalu mengapa khawatir? Menghabiskan waktu merancang sistem penghasil N UUID kecil Anda tidak praktis, selalu ada lusinan cara lain untuk meningkatkan sistem Anda.
sumber
Pada pekerjaan terakhir saya, kami mendapatkan objek dari pihak ketiga yang secara unik diidentifikasi dengan UUID. Saya memasukkan UUID-> tabel pencarian integer panjang dan menggunakan integer panjang sebagai kunci utama saya karena cara itu lebih cepat.
sumber
Menggunakan algoritma versi 1 tampaknya tabrakan tidak mungkin terjadi di bawah batasan bahwa kurang dari 10 UUID per milidetik dihasilkan dari alamat MAC yang sama
Seseorang mengoreksi saya jika saya salah menafsirkan cara kerjanya
sumber
Bagi mereka yang mengatakan bahwa UUID adalah desain yang buruk karena mereka dapat (dengan probabilitas yang sangat kecil) bertabrakan, sementara kunci yang dihasilkan DB Anda tidak akan ... Anda tahu kemungkinan kesalahan manusia yang menyebabkan tabrakan pada kunci yang dihasilkan DB Anda karena beberapa un -forseen kebutuhan JAUH JAUH lebih tinggi dari kemungkinan tabrakan UUID4. Kita tahu bahwa jika db dibuat ulang, itu akan memulai id pada 1 lagi, dan berapa banyak dari kita yang harus membuat ulang tabel ketika kita yakin kita tidak akan pernah membutuhkannya? Saya akan menaruh uang saya pada keamanan UUID ketika hal-hal mulai salah dengan yang tidak diketahui-tidak diketahui kapan saja.
sumber
Selain kasus di mana Anda harus menggunakan API orang lain yang menuntut UUID, tentunya selalu ada solusi lain. Tetapi apakah alternatif-alternatif itu akan menyelesaikan semua masalah yang dilakukan UUID? Apakah Anda akan menambahkan lebih banyak lapisan peretasan, masing-masing untuk memecahkan masalah yang berbeda, padahal Anda bisa menyelesaikan semuanya sekaligus?
Ya, secara teori UUID bisa bertabrakan. Seperti yang telah dicatat orang lain, itu sangat tidak mungkin sampai-sampai itu tidak layak dipertimbangkan. Itu tidak pernah terjadi sampai saat ini dan kemungkinan besar tidak akan pernah. Lupakan saja.
Cara yang paling "jelas" untuk menghindari benturan adalah dengan membiarkan satu server menghasilkan ID unik pada setiap penyisipan, yang jelas menciptakan masalah kinerja yang serius dan sama sekali tidak menyelesaikan masalah pembuatan offline. Ups.
Solusi "jelas" lainnya adalah otoritas pusat yang membagikan blok nomor unik terlebih dahulu, yang pada dasarnya adalah apa yang UUID V1 lakukan dengan menggunakan alamat MAC dari mesin pembangkit (melalui IEEE OUI). Tapi alamat MAC duplikat bisa terjadi karena setiap otoritas pusat pada akhirnya gagal, jadi dalam praktiknya ini jauh lebih mungkin daripada tabrakan UUID V4. Ups.
Argumen terbaik yang menentang penggunaan UUID adalah bahwa mereka "terlalu besar", tetapi skema yang (secara signifikan) lebih kecil pasti akan gagal untuk menyelesaikan masalah yang paling menarik; Ukuran UUID adalah efek samping yang melekat dari kegunaannya dalam menyelesaikan masalah tersebut.
Mungkin saja masalah Anda tidak cukup besar untuk membutuhkan apa yang ditawarkan UUID, dan dalam hal ini, silakan gunakan sesuatu yang lain. Tetapi jika masalah Anda tumbuh secara tidak terduga (dan sebagian besar terjadi), Anda akan beralih nanti - dan menyalahkan diri sendiri karena tidak menggunakannya sejak awal. Mengapa mendesain untuk kegagalan padahal semudah mendesain untuk sukses?
sumber
UUID mewujudkan semua praktik pengkodean buruk yang terkait dengan variabel global, hanya lebih buruk lagi, karena mereka adalah variabel superglobal yang dapat didistribusikan ke berbagai bagian kit.
Baru-baru ini mengalami masalah seperti penggantian printer dengan model penggantian yang tepat, dan menemukan bahwa tidak ada perangkat lunak klien yang akan berfungsi.
sumber