Guid.NewGuid () vs. Guid baru ()

346

Apa perbedaan antara Guid.NewGuid()dan new Guid()?

Mana yang lebih disukai?

OscarRyz
sumber
6
@ClintonWard Saya praktis baru ke C # dan @ Bob2Chiv Saya tidak bisa menjalankan proyek sekarang dan ingin tahu tentang hal itu.
OscarRyz
6
@OscarRyz - Untuk menguji kode dengan cepat di C #, saya menggunakan LinqPad .
DaveShaw
5
Sebenarnya saya yakin pertanyaan ini relevan, karena membingungkan dan saya tidak benar-benar "0000000-0000 .." sebagai default terbaik. Saya baru saja mengalami masalah di mana klien tidak dapat masuk ke sistem karena di suatu tempat jauh di dalam proyek Guid baru () dipanggil sebagai ganti NewGuid ()
Michiel Cornille
3
@DaveShaw - LinQPad sangat bagus dan saya sering menggunakannya. Tetapi saya ingin menunjukkan bahwa Visual Studio sekarang memiliki jendela "C # Interactive" yang sangat berguna untuk tes semacam ini.
Mark Meuer
1
@MichielCornille Baru saja mengetahui perasaan ...
Jins Peter

Jawaban:

580

new Guid() membuat pemandu all-0 "kosong" (00000000-0000-0000-0000-000000000000 tidak sangat berguna).

Guid.NewGuid() membuat panduan aktual dengan nilai unik, apa yang mungkin Anda inginkan.

MarkPflug
sumber
26
UUID kosong memang sangat berguna. Itu membuat nilai spesial yang hebat.
Jon Hanna
103
Di samping catatan, new Guid()setara dengan Guid.Empty.
Steve Guidi
30
@JonHanna Semua panduan membuat nilai spesial yang luar biasa. Sayangnya, yang kosong memiliki kecenderungan bertabrakan. Saya setuju bahwa panduan kosong berguna, biasanya untuk menunjukkan bahwa ada sesuatu yang tidak diinisialisasi.
MarkPflug
5
Yang kosong sangat berguna karena mereka bertabrakan. Nilai spesial yang tidak bertabrakan dengan nilai spesial yang diketahui tidak akan berguna.
Jon Hanna
5
Saya pikir Anda berdua setuju bahwa itu membuat "petunjuk yang dikenal" yang baik untuk dibandingkan, seperti dalam hal menunjukkan sesuatu sedang menunggu inisialisasi atau dalam beberapa kondisi yang diketahui. Secara pribadi saya lebih suka menggunakan nilai nol, tetapi saya bisa melihat bahwa seseorang mungkin membutuhkan panduan "khusus" di beberapa titik, dan panduan all-0 mungkin adalah pedoman yang paling tidak mungkin melanggar prinsip paling tidak mengejutkan bagi pengelola masa depan. kode.
PeterL
37

Guid.NewGuid() membuat UUID baru menggunakan algoritma yang dirancang untuk membuat tabrakan sangat, sangat tidak mungkin.

new Guid() menciptakan UUID yang semuanya nol.

Secara umum Anda lebih suka yang pertama, karena itulah gunanya UUID (kecuali jika Anda menerimanya dari tempat lain tentunya).

Ada kasus di mana Anda memang menginginkan UUID sepenuhnya nol, tetapi dalam kasus ini Guid.Emptyatau default(Guid)lebih jelas tentang niat Anda, dan ada sedikit peluang seseorang membacanya mengharapkan nilai unik telah dibuat.

Secara keseluruhan, new Guid()tidak terlalu berguna karena kurangnya kejelasan ini, tetapi tidak mungkin untuk memiliki tipe-nilai yang tidak memiliki konstruktor tanpa parameter yang mengembalikan nilai all-nol-dan-nulls.

Sunting: Sebenarnya, adalah mungkin untuk memiliki konstruktor tanpa parameter pada tipe nilai yang tidak mengatur semuanya menjadi nol dan nol, tetapi Anda tidak dapat melakukannya di C #, dan aturan tentang kapan akan dipanggil dan kapan akan ada hanya menjadi semua-nol struct yang dibuat membingungkan, jadi itu bukan ide yang baik pula.

Jon Hanna
sumber
16
Saya akan menambahkan ini untuk bersenang-senang. Untuk kemungkinan tabrakan 1%, Anda harus menghasilkan sekitar 2.600.000.000.000.000.000.000 GUID
Clinton Ward
8
@ClintonWard tergantung pada algoritma UUID mana yang digunakan, tetapi karena beberapa menggunakan alamat MAC untuk menghindari tabrakan antar mesin, dan semua menggunakan faktor waktu untuk menghindari tabrakan pada mesin yang sama, Anda harus membuat lebih dari matematika normal menyarankan. Kecuali Anda sengaja mengacaukan algoritme dengan mengubah waktu dan mengacaukan alamat MAC, dalam hal ini Anda harus mendapatkannya dengan cepat - tapi itu dengan sengaja mengacaukan input.
Jon Hanna
2
Itu v1 Guid. MS GUID yang lebih baru adalah V4 dan tidak menggunakan alamat MAC sebagai bagian dari generasi GUID. Waktu masih merupakan faktor
Clinton Ward
16

[Saya mengerti ini adalah utas lama, hanya menambahkan beberapa detail lagi]. Dua jawaban oleh Mark dan Jon Hanna meringkaskan perbedaan, meskipun mungkin menarik beberapa yang

Guid.NewGuid()

Akhirnya panggilan CoCreateGuid (panggilan COM ke Ole32) (referensi di sini ) dan pekerjaan yang sebenarnya dilakukan oleh UuidCreate .

Guid.Empty dimaksudkan untuk digunakan untuk memeriksa apakah Guid berisi semua nol. Ini juga bisa dilakukan dengan membandingkan nilai Guid yang dimaksud dengan Guid baru ()

Jadi, jika Anda memerlukan pengidentifikasi unik , jawabannya adalah Guid.NewGuid ()

Sudhanshu Mishra
sumber
-2

Guid.NewGuid(), karena membuat GUID sebagaimana dimaksud.

Guid.NewGuid()membuat Guidobjek kosong , menginisialisasi dengan memanggil CoCreateGuiddan mengembalikan objek.

new Guid() hanya membuat GUID kosong (semua nol, saya pikir).

Saya kira mereka harus membuat konstruktor menjadi publik sebagaimana Guidadanya struct.

Sharath
sumber
5
Apa gunanya menambahkan jawaban yang tidak menambahkan apa pun yang belum ada dalam jawaban yang sudah bertahun-tahun ada di sini?
Dinerdo