Saya sedang mengerjakan basis data di SQL Server 2000 yang menggunakan GUID untuk setiap pengguna yang menggunakan aplikasi yang terkait dengannya. Entah bagaimana, dua pengguna berakhir dengan GUID yang sama. Saya tahu bahwa microsoft menggunakan algoritme untuk menghasilkan GUID acak yang memiliki peluang sangat rendah untuk menyebabkan kolusi, tetapi apakah tabrakan masih dimungkinkan?
sql-server
guid
Jason Baker
sumber
sumber
Jawaban:
Pada dasarnya tidak. Saya pikir seseorang pergi mucking dengan database Anda. Bergantung pada GUID versi yang Anda gunakan nilainya unik (untuk hal-hal seperti GUID versi 1), atau unik dan tidak dapat diprediksi (untuk hal-hal seperti GUID versi 4). Implementasi SQL Server untuk fungsi NEWID () mereka tampaknya menggunakan nomor acak 128-bit, sehingga Anda tidak akan mendapatkan tabrakan.
Untuk kemungkinan tabrakan 1%, Anda harus menghasilkan sekitar 2.600.000.000.000.000.000.000 GUID.
sumber
Pada dasarnya mereka tidak mungkin! , kemungkinannya sangat rendah .
Tapi ... Saya satu-satunya orang di dunia yang saya kenal, yang pernah mengalami tabrakan GUID (ya!).
Dan saya yakin akan hal itu, dan itu bukan kesalahan.
Bagaimana itu terjadi, dalam aplikasi kecil yang berjalan di Pocket PC, pada akhir operasi, perintah yang menghasilkan GUID harus dikeluarkan. Perintah setelah dieksekusi di server itu disimpan dalam tabel perintah di server bersama dengan tanggal eksekusi. Suatu hari ketika saya sedang debug saya mengeluarkan perintah modul (dengan GUID yang baru dibuat terpasang) dan tidak ada yang terjadi. Saya melakukannya lagi (dengan panduan yang sama, karena panduan hanya dihasilkan sekali di awal operasi), dan lagi, dan tidak ada, akhirnya mencoba mencari tahu mengapa perintah tidak dijalankan, saya memeriksa tabel perintah, dan GUID yang sama dengan yang sekarang dimasukkan 3 minggu yang lalu. Tidak percaya ini, saya mengembalikan database dari cadangan 2 minggu, dan panduan ada di sana. Memeriksa kode, panduan baru itu dibuat tanpa keraguan tentangnya.
Sunting: ada beberapa faktor yang bisa sangat meningkatkan peluang terjadinya hal ini, aplikasi sedang berjalan di emulator PocketPC, dan emulator memiliki fitur save state, yang berarti bahwa setiap kali keadaan dipulihkan, waktu setempat dipulihkan juga waktu setempat dan panduan didasarkan pada timer internal .... juga algoritma yang menghasilkan panduan untuk kerangka kerja kompak mungkin kurang lengkap daripada misalnya COM satu ...
sumber
Secara teori mereka mungkin, tetapi dengan angka 3,4E38 kemungkinan, jika Anda membuat puluhan triliun GUID dalam setahun kemungkinan memiliki satu duplikat adalah 0,00000000006 ( Sumber ).
Jika dua pengguna berakhir dengan GUID yang sama, saya berani bertaruh bahwa ada bug dalam program yang menyebabkan data disalin atau dibagikan.
sumber
Pertama mari kita lihat peluang tabrakan dua GUID. Bukan, seperti jawaban lain nyatakan, 1 dalam 2 ^ 128 (10 ^ 38) karena paradoks ulang tahun , yang berarti bahwa untuk peluang 50% dua GUID bertabrakan probabilitas sebenarnya 1 dalam 2 ^ 64 (10 ^ 19) yang jauh lebih kecil. Namun, ini masih merupakan angka yang sangat besar, dan karena itu kemungkinan tabrakan dengan asumsi Anda menggunakan jumlah GUID yang masuk akal adalah rendah.
Perhatikan juga bahwa GUID tidak mengandung stempel waktu atau alamat MAC seperti yang tampaknya dipercaya banyak orang. Ini berlaku untuk GUID v1 tetapi sekarang GUID v4 digunakan, yang hanya merupakan angka pseudo-acak yang berarti bahwa kemungkinan tabrakan bisa dibilang lebih tinggi karena mereka tidak lagi unik untuk waktu dan mesin.
Jadi intinya jawabannya adalah ya, tabrakan itu mungkin. Tetapi mereka sangat tidak mungkin.
Sunting: diperbaiki untuk mengatakan 2 ^ 64
sumber
1 in 10^64 (10^19)
, yang saya pikir seharusnya1 in 2^64 (10^19)
. Saya juga sangat bingung bagaimana Anda berpikir paradoks ulang tahun hanya berlaku untuk 2 angka. Saya berasumsi Anda telah melihat en.wikipedia.org/wiki/Birthday_paradox . Tabel menunjukkan berapa banyak panduan yang Anda butuhkan untuk probabilitas duplikat yang diberikan. Dari tabel itu, probabilitas 1 dalam 10 ^ 18 membutuhkan panduan 2.6 * 10 ^ 10, bukan sesuatu yang mendekati hanya dua GUID.Kemungkinan dua GUID acak bertabrakan (~ 1 dalam 10 ^ 38) lebih rendah daripada kemungkinan tidak mendeteksi paket TCP / IP yang rusak (~ 1 dalam 10 ^ 10). http://wwwse.inf.tu-dresden.de/data/courses/SE1/SE1-2004-lec12.pdf , halaman 11. Ini juga berlaku untuk drive disk, drive cd, dll ...
GUID secara statistik unik dan data yang Anda baca dari db hanya benar secara statistik.
sumber
Saya akan menganggap pisau cukur Occam sebagai panduan yang baik dalam kasus ini. Sangat tidak mungkin Anda memiliki tabrakan GUID. Kemungkinan besar Anda memiliki bug, atau seseorang mengacaukan data Anda.
sumber
Lihat artikel Wikipedia Global Identifier . Ada beberapa cara untuk menghasilkan GUID. Rupanya cara lama (?) Menggunakan alamat Mac, cap waktu ke unit yang sangat pendek dan penghitung unik (untuk mengelola generasi cepat di komputer yang sama), sehingga membuat duplikat mereka hampir mustahil. Tetapi GUID ini dijatuhkan karena bisa digunakan untuk melacak pengguna ...
Saya tidak yakin dengan algoritma baru yang digunakan oleh Microsoft (artikel mengatakan urutan GUID dapat diprediksi, sepertinya mereka tidak lagi menggunakan cap waktu? Artikel Microsoft yang ditautkan di atas mengatakan sesuatu yang lain ...).
Sekarang, GUID dirancang dengan hati-hati, dengan nama, unik secara global, jadi saya akan mengambil risiko itu tidak mungkin, atau kemungkinan sangat sangat sangat rendah. Saya akan mencari di tempat lain.
sumber
Dua mesin Win95 yang memiliki kartu ethernet dengan alamat MAC duplikat akan mengeluarkan GUIDS duplikat dalam kondisi yang dikontrol dengan ketat, terutama jika, misalnya, listrik padam di gedung dan mereka berdua boot pada waktu yang sama persis.
sumber
Saya akan mengawali ini dengan "Saya bukan orang yang berjejaring, jadi saya bisa membuat kalimat yang sama sekali tidak jelas berikut.".
Ketika saya bekerja di Illinois State University, kami memiliki dua desktop Dell, dipesan pada waktu yang berbeda. Kami menempatkan yang pertama di jaringan, tetapi ketika kami mencoba menempatkan yang kedua di jaringan kami mulai menerima kesalahan gila. Setelah banyak pemecahan masalah, ditentukan bahwa kedua mesin memproduksi GUID yang sama (saya tidak yakin untuk apa, tetapi itu membuat keduanya tidak dapat digunakan di jaringan). Dell benar-benar mengganti kedua mesin sebagai cacat.
sumber
Saya tahu orang-orang menyukai jawaban merasa-baik bahwa GUID ajaib dan dijamin unik, tetapi dalam kenyataannya, sebagian besar GUID hanya angka acak 121-bit (tujuh bit dihabiskan untuk memformat). Jika Anda tidak akan merasa nyaman menggunakan nomor acak besar, maka Anda seharusnya tidak merasa nyaman menggunakan GUID.
sumber
Bisakah kode yang digunakan untuk menghasilkan GUID memiliki bug di dalamnya? Ya tentu saja bisa. Tetapi jawabannya sama dengan bug kompiler - kode Anda sendiri adalah urutan besarnya lebih cenderung menjadi buggy, jadi lihat dulu dulu.
sumber
Tentu saja mungkin .... Kemungkinan? Tidak mungkin, tetapi itu mungkin.
Ingat, mesin yang sama menghasilkan setiap GUID (server), jadi banyak "keacakan" yang didasarkan pada informasi spesifik mesin hilang.
sumber
Hanya untuk menyeringai, coba skrip berikut ... (berfungsi pada SQL 2005, tidak yakin tentang 2000)
Menjalankan ini berulang kali (membutuhkan waktu kurang dari satu detik) menghasilkan rentang yang cukup luas dari pemilihan pertama, bahkan dengan jeda waktu yang sangat pendek. Sejauh ini pemilihan kedua belum menghasilkan apa-apa.
sumber
Tidak mungkin jika pengguna memiliki mesin yang berbeda dengan kartu jaringan, dan bahkan jika itu masih merupakan risiko yang hampir secara teoritis marjinal.
Secara pribadi saya akan mencari di tempat lain karena lebih mungkin bug daripada bentrokan GUID ...
Memberikan tentu saja Anda tidak memotong bit GUID untuk membuatnya lebih pendek.
sumber
Tentu itu mungkin, dan bahkan mungkin. Ini tidak seperti setiap GUID berada di bagian acak dari ruang angka yang mungkin. Jika dua utas berusaha menghasilkan satu secara bersamaan, kecuali beberapa fungsi GUID terpusat dengan semafor di sekitarnya, mereka dapat berakhir dengan nilai yang sama.
sumber
Sangat tidak mungkin bahwa Anda akan mengalami tabrakan GUID jika Anda menghasilkan mereka melalui sesuatu seperti
NEWID()
fungsi di SQL Server (meskipun tentu saja mungkin, karena jawaban lain telah menekankan). Satu hal yang belum mereka tunjukkan adalah kemungkinan besar Anda akan mengalami tabrakan jika Anda membuat GUID di JavaScript pada peramban di alam. Tidak hanya kadang-kadang ada masalah di RNG di browser yang berbeda, tetapi saya juga mengalami masalah di mana laba-laba Google tampaknya men-cache hasil fungsi seperti itu, dan akhirnya berulang kali meneruskan GUID yang sama ke sistem kami.Lihat berbagai jawaban di sini untuk perincian lebih lanjut:
Tabrakan saat membuat UUID dalam JavaScript?
sumber