Dalam salah satu proyek saya sedang mengerjakan pola berikut ini terlihat secara teratur:
var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
guid = Guid.NewGuid().ToString();
}
Sementara saya mengerti bahwa a GUID tidak dijamin unik dan sesuai dokumentasi MSDN, GUID yang dihasilkan mungkin nol , apakah ini pertimbangan praktis sebenarnya layak untuk mengirim pengujian siklus baik dalam pengertian komputasi maupun dalam hal waktu pengembang memikirkannya ?
Jawaban:
Saya akan menyarankan itu tidak layak memeriksa Guid.Empty. Dokumen untuk Guid.NewGuid untuk beberapa alasan menyebutkan hal itu
Guid.NewGuid adalah pembungkus untuk Win32 API CoCreateGuid , yang tidak menyebutkan pengembalian semua nol.
Raymond Chen melangkah lebih jauh , menyarankan itu
Jadi, tidak, saya tidak akan khawatir tentang itu. Saya tidak akan menebak mengapa Guid. Dokumen baru bahkan menyebutkannya.
sumber
Jika Anda menemukan
Guid.NewGuid() == Guid.Empty
Anda telah memenangkan lotere paling sulit di dunia. Jangan repot-repot dengan keunikan atau pemeriksaan tabrakan. Tidak harus melakukan itu adalah apa guids yang untuk . Saya akan menghindarkan Anda dari matematika, ada di mana-mana di web.Juga, Windows guids selalu memiliki satu "angka" sama dengan
4
. Ada beberapa struktur untuk panduan.Cuplikan kode yang Anda poskan tampak seperti salah satu dev lupa untuk menginisialisasi
Guid
variabel dan menemukannyaGuid.Empty
. Dia keliru diidentifikasiGuid.NewGuid()
sebagai penyebabnya. Sekarang dia akan selamanya percaya takhayul akan hal ini.Bagaimanapun, ini adalah pertanyaan yang salah untuk ditanyakan. Saya yakin kode Anda tidak hanya bergantung pada tidak pernah menggambar
Guid.Empty
tetapi juga pada keunikan. Ituwhile
loop tidak menegakkan keunikan. Panduan ada untuk menghasilkan nilai unik tanpa koordinasi. Itu adalah kasus penggunaan mereka.sumber
Lihatlah kode sumber
Guid.NewGuid
metode :Lihat kontrak kode? The
Guid.NewGuid
Metode tidak pernah memberikan GUID kosong.sumber
Jika Anda akan memeriksa GUID terhadap nol GUID, Anda dengan logika yang sama juga perlu melakukan uji tuntas memeriksa semua GUID lain dalam aplikasi Anda (karena kemungkinan mendapatkan nol harus sama dengan probabilitas mendapatkan GUID lain di aplikasi Anda *). Anda perlu melakukan ini untuk membuktikan aksioma yang Anda lakukan adalah bahwa GUID ini akan unik (yang sebenarnya merupakan aksioma yang sama dengan pengujian vs 0).
Jelas melakukan ini tidak masuk akal.
TLDR; Jika Anda bisa mempercayai NewGuid () untuk menghasilkan hasil yang unik, Anda juga bisa mempercayai itu untuk tidak menghasilkan satu pun GUID yang dikenal.
* Ini sebenarnya bukan probabilitas yang sama dengan. GUID NET selalu sesuai dengan yang berikut ini
{________-____-4___-____-____________}
sehingga NewGuid TIDAK AKAN PERNAH menghasilkan pedoman nolHanya untuk bersenang-senang saya menyarankan perbaikan pada dokumen di sini: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid
sumber