Apakah GUID unik 100% dari waktu?
Apakah ini akan tetap unik di beberapa utas?
Apakah GUID unik 100% dari waktu?
Apakah ini akan tetap unik di beberapa utas?
Jawaban:
Sementara setiap GUID yang dihasilkan tidak dijamin unik, jumlah total kunci unik (2 128 atau 3,4 × 10 38 ) sangat besar sehingga kemungkinan nomor yang sama dihasilkan dua kali sangat kecil. Sebagai contoh, perhatikan alam semesta yang dapat diamati, yang berisi sekitar 5 × 10 22 bintang; setiap bintang kemudian dapat memiliki 6,8 × 10 15 GUID universal unik.
Dari Wikipedia .
Ini adalah beberapa artikel bagus tentang bagaimana GUID dibuat (untuk .NET) dan bagaimana Anda bisa mendapatkan panduan yang sama dalam situasi yang tepat.
https://ericlippert.com/2012/04/24/guid-guide-part-one/
https://ericlippert.com/2012/04/30/guid-guide-part-two/
https://ericlippert.com/2012/05/07/guid-guide-part-three/
2^128
ditulis kira-kira: 34,028,236,692,093,846,346,337,460,743,177,000,000
. Secara statistik, jika Anda menghitung 1000 GUID setiap detik, masih butuh triliunan tahun untuk mendapatkan duplikat.
Jika Anda takut dengan nilai-nilai GUID yang sama, maka letakkan dua di antaranya satu sama lain.
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
Jika Anda terlalu paranoid maka taruh tiga.
999999999
dalam bentuk Anda, saya pikir Paranoia akan mem-splode Browser saya.
Jawaban sederhananya adalah ya.
Raymond Chen menulis artikel hebat tentang GUID dan mengapa substring dari GUID tidak dijamin unik. Artikel ini masuk ke beberapa kedalaman tentang cara GUID dihasilkan dan data yang mereka gunakan untuk memastikan keunikan, yang harus menjelaskan mengapa mereka :-)
Sebagai catatan, saya bermain-main dengan Volume GUID di Windows XP. Ini adalah tata letak partisi yang sangat tidak jelas dengan tiga disk dan empat belas volume.
\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
| | | | |
| | | | +-- 6f = o
| | | +---- 69 = i
| | +------ 72 = r
| +-------- 61 = a
+---------- 6d = m
Bukan karena GUID sangat mirip tetapi fakta bahwa semua GUID memiliki string "mario" di dalamnya. Apakah itu kebetulan atau ada penjelasan di balik ini?
Sekarang, ketika googling untuk bagian 4 di GUID saya menemukan sekitar 125.000 hit dengan GUID volume.
Kesimpulan: Ketika datang ke GUID Volume mereka tidak seunik GUID lain.
msiexec
, ini mencantumkan semua MSI GUID tentang program kantor. Mereka semua mengeja 0FF1CE
. Sepertinya Microsoft memiliki interpretasi yang cukup ... longgar ... tentang cara membuat GUID;)
0FF1CE
GUID berada di bawah bagian "Kompatibilitas mundur NCS" dari RFC-4122, tetapi tidak mungkin bahwa Microsoft mengikuti aturan NCS untuk nilai-nilai tersebut.
Seharusnya tidak terjadi. Namun, ketika .NET berada di bawah beban yang berat, dimungkinkan untuk mendapatkan panduan duplikat. Saya memiliki dua server web berbeda menggunakan dua server sql berbeda. Saya pergi untuk menggabungkan data dan menemukan saya memiliki 15 juta guid dan 7 duplikat.
Guid.NewGuid
selalu menghasilkan GUID v4 (dan selalu memiliki). Tim pasti memiliki sumber entropi yang sangat buruk.
Ya, GUID harus selalu unik. Ini didasarkan pada perangkat keras dan waktu, ditambah beberapa bit tambahan untuk memastikan itu unik. Saya yakin secara teori mungkin berakhir dengan dua yang identik, tetapi sangat tidak mungkin dalam skenario dunia nyata.
Inilah artikel hebat oleh Raymond Chen tentang Panduan:
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Panduan secara statistik unik. Kemungkinan dua klien berbeda menghasilkan Guid yang sama sangat kecil (dengan asumsi tidak ada bug dalam kode yang menghasilkan Guid). Anda mungkin juga khawatir tentang kesalahan prosesor Anda karena sinar kosmik dan memutuskan bahwa 2 + 2 = 5 hari ini.
Beberapa utas yang mengalokasikan panduan baru akan mendapatkan nilai unik, tetapi Anda harus mengetahui bahwa fungsi yang Anda panggil aman dari utas. Di lingkungan mana ini?
Eric Lippert telah menulis serangkaian artikel yang sangat menarik tentang GUID.
Ada komputer pribadi dengan urutan 2 30 di dunia (dan tentu saja banyak perangkat genggam atau perangkat komputasi non-PC yang memiliki tingkat daya komputasi yang kurang lebih sama, tetapi mari abaikan itu). Mari kita asumsikan bahwa kita menempatkan semua PC di dunia untuk tugas menghasilkan GUID; jika masing-masing dapat menghasilkan, katakanlah, 20 GUIDs per detik kemudian setelah hanya sekitar 72 detik - seratus lima puluh triliun tahun - Anda akan memiliki peluang yang sangat tinggi untuk menghasilkan tabrakan dengan GUID spesifik Anda. Dan kemungkinan tabrakan menjadi cukup baik setelah hanya tiga puluh triliun tahun.
Secara teori, tidak, mereka tidak unik. Dimungkinkan untuk menghasilkan panduan yang identik berulang kali. Namun, kemungkinan itu terjadi sangat rendah sehingga Anda dapat menganggapnya unik.
Saya telah membaca sebelumnya bahwa kemungkinannya sangat rendah sehingga Anda benar-benar harus menekankan tentang sesuatu yang lain - seperti server Anda terbakar secara spontan atau bug lain dalam kode Anda. Artinya, anggap unik dan jangan membuat kode apa pun untuk "menangkap" duplikat - gunakan waktu Anda untuk sesuatu yang lebih mungkin terjadi (yaitu hal lain).
Saya berusaha untuk menggambarkan kegunaan GUID untuk audiens blog saya (anggota keluarga non-teknis). Dari sana (melalui Wikipedia), kemungkinan menghasilkan GUID duplikat:
Sepertinya tidak ada yang menyebutkan matematika aktual dari kemungkinan itu terjadi.
Pertama, mari kita asumsikan kita dapat menggunakan seluruh ruang 128 bit (Guid v4 hanya menggunakan 122 bit).
Kita tahu bahwa probabilitas umum untuk TIDAK mendapatkan duplikat dalam n
pengambilan adalah:
(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )
Karena 2 128 jauh lebih besar daripada n
, kita dapat memperkirakan ini untuk:
(1-1 / 2 128 ) n (n-1) / 2
Dan karena kita dapat mengasumsikan n
jauh lebih besar dari 0, kita dapat memperkirakan bahwa untuk:
(1-1 / 2 128 ) n ^ 2/2
Sekarang kita dapat menyamakan ini dengan probabilitas "dapat diterima", katakanlah 1%:
(1-1 / 2 128 ) n ^ 2/2 = 0,01
Yang kami pecahkan n
dan dapatkan:
n = sqrt (2 * log 0,01 / log (1-1 / 2 128 ))
Yang menjadi Wolfram Alpha menjadi 5.598318 × 10 19
Untuk memasukkan angka itu ke dalam perspektif, mari kita ambil 10.000 mesin, masing-masing memiliki CPU 4 inti, melakukan 4Ghz dan menghabiskan 10.000 siklus untuk menghasilkan Guid dan tidak melakukan hal lain. Itu akan memakan waktu ~ 111 tahun sebelum mereka menghasilkan duplikat.
Dari http://www.guidgenerator.com/online-guid-generator.aspx
Apa itu GUID?
GUID (atau UUID) adalah akronim untuk 'Pengidentifikasi Unik Global' (atau 'Pengidentifikasi Unik Global'). Ini adalah angka integer 128-bit yang digunakan untuk mengidentifikasi sumber daya. Istilah GUID umumnya digunakan oleh pengembang yang bekerja dengan teknologi Microsoft, sedangkan UUID digunakan di tempat lain.
Seberapa unik GUID?
128-bit cukup besar dan algoritma pembangkitan cukup unik sehingga jika 1.000.000.000 GUID per detik dihasilkan selama 1 tahun, kemungkinan duplikat hanya 50%. Atau jika setiap manusia di Bumi menghasilkan 600.000.000 GUID hanya akan ada kemungkinan 50% dari duplikat.
Saya mengalami GUID duplikat.
Saya menggunakan pemindai desktop Penerimaan Rapi dan dilengkapi dengan perangkat lunak basis data berpemilik. Perangkat lunak ini memiliki fitur sinkronisasi ke cloud, dan saya terus mendapatkan kesalahan setelah sinkronisasi. Melihat sebentar log mengungkapkan garis yang luar biasa:
"errors": [{"code": 1, "message": "creator_guid: sudah diambil", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}
Saya agak tidak percaya, tetapi tentu saja cukup, ketika saya menemukan jalan ke database lokal saya yang rapi dan menghapus catatan yang berisi GUID itu, kesalahan itu berhenti terjadi.
Jadi untuk menjawab pertanyaan Anda dengan bukti anekdotal, tidak. Duplikat dimungkinkan. Tetapi kemungkinan alasan mengapa itu terjadi bukan karena kebetulan, tetapi karena praktik standar tidak dipatuhi. (Aku hanya tidak seberuntung itu) Namun, aku tidak bisa mengatakan dengan pasti. Itu bukan perangkat lunak saya.
Dukungan pelanggan mereka sangat sopan dan membantu, tetapi mereka pasti belum pernah mengalami masalah ini sebelumnya karena setelah 3+ jam di telepon dengan mereka, mereka tidak menemukan solusinya. (FWIW, saya sangat terkesan dengan Rapi, dan kesalahan ini, betapapun membuat frustrasi, tidak mengubah pendapat saya tentang produk mereka.)
MSDN :
Ada kemungkinan yang sangat rendah bahwa nilai Guid baru semuanya nol atau sama dengan Guid lainnya.
Jika jam sistem Anda diatur dengan benar dan belum dibungkus, dan jika NIC Anda memiliki MAC sendiri (yaitu Anda belum menetapkan MAC kustom) dan vendor NIC Anda belum mendaur ulang MAC (yang seharusnya tidak dilakukan oleh mereka) tetapi yang telah diketahui terjadi), dan jika fungsi pembuatan GUID sistem Anda diimplementasikan dengan benar, maka sistem Anda tidak akan pernah menghasilkan duplikat GUID.
Jika semua orang di dunia yang membuat GUID mengikuti aturan-aturan itu maka GUID Anda akan menjadi unik secara global.
Dalam praktiknya, jumlah orang yang melanggar aturan rendah, dan GUID mereka tidak mungkin "melarikan diri". Konflik tidak mungkin secara statistik.
Apakah GUID unik 100% dari waktu?
Tidak dijamin, karena ada beberapa cara menghasilkannya. Namun, Anda dapat mencoba untuk menghitung peluang menciptakan dua GUIDs yang identik dan Anda mendapatkan ide: GUID memiliki 128 bit, maka, ada 2 128 GUID yang berbeda - jauh lebih dari ada bintang di alam semesta. Baca artikel wikipedia untuk lebih jelasnya.
Dalam arti yang lebih umum, ini dikenal sebagai "masalah ulang tahun" atau "paradoks ulang tahun". Wikipedia memiliki gambaran yang cukup bagus di: Wikipedia - Masalah Ulang Tahun
Dalam istilah yang sangat kasar, akar kuadrat dari ukuran kumpulan adalah perkiraan kasar ketika Anda dapat mengharapkan 50% kemungkinan duplikat. Artikel ini menyertakan tabel probabilitas ukuran kumpulan dan berbagai probabilitas, termasuk baris untuk 2 ^ 128. Jadi untuk kemungkinan tabrakan 1% Anda akan berharap untuk secara acak memilih angka 2,6 * 10 ^ 18 128-bit. Peluang 50% membutuhkan pengambilan 2.2 * 10 ^ 19, sedangkan SQRT (2 ^ 128) adalah 1.8 * 10 ^ 19.
Tentu saja, itu hanya kasus ideal dari proses yang benar-benar acak. Seperti yang disebutkan lainnya, banyak yang menggunakan aspek acak itu - seberapa bagus generator dan seed-nya? Akan lebih baik jika ada beberapa dukungan perangkat keras untuk membantu proses ini yang akan lebih tahan peluru kecuali bahwa apa pun dapat dipalsukan atau divirtualisasi. Saya menduga itu mungkin menjadi alasan mengapa alamat MAC / stempel waktu tidak lagi dimasukkan.
Untuk hasil yang lebih baik, cara terbaik adalah menambahkan GUID dengan stempel waktu (Hanya untuk memastikan bahwa itu tetap unik)
Guid.NewGuid().ToString() + DateTime.Now.ToString();
Algoritma GUID biasanya diimplementasikan sesuai dengan spesifikasi GUID v4, yang pada dasarnya adalah string pseudo-acak. Sayangnya, ini termasuk dalam kategori "kemungkinan tidak unik" , dari Wikipedia (saya tidak tahu mengapa begitu banyak orang mengabaikan bit ini): "... versi GUID lainnya memiliki sifat dan probabilitas keunikan yang berbeda, mulai dari keunikan yang dijamin kemungkinan non-keunikan. "
Sifat pseudo-acak dari JavaScript V8 Math.random()
adalah MENGERIKAN di keunikan, dengan tabrakan sering terjadi setelah hanya beberapa ribu iterasi, tetapi V8 bukan satu-satunya penyebab. Saya telah melihat tabrakan GUID di dunia nyata menggunakan implementasi PHP dan Ruby dari GUID v4.
Karena semakin umum untuk skala pembuatan ID di beberapa klien, dan kelompok server, entropi mendapat untung besar - kemungkinan seed acak yang sama digunakan untuk menghasilkan ID meningkat (waktu sering digunakan sebagai seed acak di generator pseudo-acak), dan tabrakan GUID meningkat dari "kemungkinan tidak unik" menjadi "sangat mungkin menyebabkan banyak masalah".
Untuk mengatasi masalah ini, saya mulai membuat algoritma ID yang dapat mengukur dengan aman, dan membuat jaminan yang lebih baik terhadap tabrakan. Itu melakukannya dengan menggunakan cap waktu, penghitung klien dalam memori, sidik jari klien, dan karakter acak. Kombinasi faktor menciptakan kompleksitas aditif yang sangat tahan terhadap benturan, bahkan jika Anda menskalakannya di sejumlah host:
Saya telah mengalami GUID tidak unik selama multi-threaded / multi-proses unit-testing (juga?). Saya kira itu ada hubungannya dengan, semua nada yang lain sama, penyemaian identik (atau kurang penyemaian) generator acak semu. Saya menggunakannya untuk menghasilkan nama file yang unik. Saya menemukan OS jauh lebih baik dalam melakukan itu :)
Anda bertanya apakah GUID 100% unik. Itu tergantung pada jumlah GUID yang harus unik di antara. Karena jumlah GUID mendekati tak terhingga, probabilitas untuk duplikat GUID mendekati 100%.
Jawaban "Apakah GUID 100% unik?" hanyalah "Tidak" .
Jika Anda ingin 100% keunikan GUID maka lakukan hal berikut.
Bagian tersulit bukanlah tentang menghasilkan Panduan yang terduplikasi.
Bagian tersulit adalah merancang database untuk menyimpan semua yang dihasilkan untuk memeriksa apakah itu benar-benar digandakan.
Dari WIKI:
Misalnya, jumlah UUID versi 4 acak yang perlu dibuat agar memiliki probabilitas 50% dari setidaknya satu tabrakan adalah 2,71 triliun, dihitung sebagai berikut:
masukkan deskripsi gambar di sini
Jumlah ini setara dengan menghasilkan 1 miliar UUID per detik selama sekitar 85 tahun, dan file yang mengandung banyak UUID ini, dengan 16 byte per UUID, akan menjadi sekitar 45 exabytes, beberapa kali lebih besar dari database terbesar saat ini yang ada, yang ada di urutan ratusan petabyte
GUID adalah singkatan dari Global Unique Identifier
Singkat: (petunjuknya ada di nama)
Secara Detail: GUID dirancang untuk menjadi unik; mereka dihitung dengan menggunakan metode acak berdasarkan jam komputer dan komputer itu sendiri, jika Anda membuat banyak GUID pada milidetik yang sama pada mesin yang sama adalah mungkin mereka cocok tetapi untuk hampir semua operasi normal mereka harus dianggap unik.