Guid.NewGuid () ve yeni Guid ()


347

Arasındaki fark nedir Guid.NewGuid()ve new Guid()?

Hangisi tercih edilir?


6
@ClintonWard C # ve @ Bob2Chiv için pratik olarak yeniyim Projeyi şu anda çalıştıramıyorum ve merak ettim.
OscarRyz

6
@OscarRyz - C # için hızla test kodu, kullandığım LINQPad .
DaveShaw

5
Aslında bu sorunun alakalı olduğuna inanıyorum çünkü kafa karıştırıcı ve en iyi varsayılan olarak gerçekten "0000000-0000 .." değilim. Bir istemcinin sisteme giriş yapamaması sorunuyla karşılaştım çünkü projenin derinliklerinde NewGuid () yerine yeni Guid () çağrıldı
Michiel

3
@DaveShaw - LinQPad harika ve çok kullanıyorum. Ancak Visual Studio'nun artık bu tür testler için çok yararlı olan bir "C # Etkileşimli" penceresi olduğunu belirtmek istedim.
Mark Meuer

1
@MichielCornille Duygu kardeşim sadece bilmek lazım ...
Jins Peter

Yanıtlar:


583

new Guid() "boş" bir all-0 kılavuzu yapar (00000000-0000-0000-0000-000000000000 çok kullanışlı değildir).

Guid.NewGuid() benzersiz bir değerle gerçek bir rehber yapar, muhtemelen ne istersiniz.


26
Boş bir UUID gerçekten çok faydalıdır. Büyük bir özel değer yapar.
Jon Hanna

103
Bir yan notta, new Guid()eşdeğerdir Guid.Empty.
Steve Guidi

30
@JonHanna Tüm rehberler çok özel değerler yapar. Maalesef, boş olanların çarpışması için bir tenhası var. Boş kılavuzların, tipik olarak bir şeyin başlatılmadığını göstermek için yararlı olduğunu kabul ediyorum.
MarkPflug

5
Boş olanlar çok faydalıdır çünkü çarpışırlar. Bilinen özel değerle çarpışmayan özel bir değer işe yaramaz.
Jon Hanna

5
Sanırım ikiniz, bir şeyin başlatılmayı beklediğini veya bilinen başka bir durumda olduğunu belirtmek gibi, karşılaştırmak için iyi bir "bilinen rehber" oluşturduğunu kabul ediyorsunuz. Şahsen null değer kullanmayı tercih ederim, ama birinin bir noktada "özel" bir kılavuza ihtiyacı olabileceğini görebiliyorum ve all-0 kılavuzu muhtemelen gelecekteki koruyucular için en az sürpriz prensibini ihlal etme olasılığı en az olan rehber kod.
PeterL

37

Guid.NewGuid() çarpışmaları çok, çok olası hale getirmek için tasarlanmış bir algoritma kullanarak yeni bir UUID oluşturur.

new Guid() sıfırlar olan bir UUID oluşturur.

Genellikle öncekini tercih edersiniz, çünkü bu bir UUID'nin noktasıdır (tabii ki başka bir yerden almıyorsanız).

Gerçekten sıfırdan küçük bir UUID istediğiniz durumlar vardır, ancak bu durumda Guid.Emptyveya default(Guid)niyetiniz hakkında daha nettir ve benzersiz bir değer yaratıldığını düşünen birinin okuma şansı daha azdır.

Genel olarak, new Guid()bu netlik eksikliği nedeniyle faydalı değil, ancak sıfır-ve-sıfır değerlerini döndüren parametresiz bir yapıcıya sahip olmayan bir değer türüne sahip olmak mümkün değil.

Düzenleme: Aslında, her şeyi sıfır ve boş olarak ayarlamayan bir değer türünde parametresiz bir kurucuya sahip olmak mümkündür, ancak C # ile yapamazsınız ve ne zaman çağrılacağına ve ne zaman çağrılacağına ilişkin kurallar sadece sıfırdan oluşan bir yapı kafa karıştırıcı olabilir, bu yüzden zaten iyi bir fikir değil.


16
Bunu eğlence için ekleyeceğim. % 1'lik bir çarpışma şansı için, yaklaşık 2.600.000.000.000.000.000 GUID oluşturmanız gerekir
Clinton Ward

8
Hangi UUID algoritmalarının kullanıldığına bağlıdır, ancak bazıları makineler arasındaki çarpışmaları önlemek için MAC adresleri kullandığından ve hepsi aynı makinede çarpışmaları önlemek için bir zaman faktörü kullandığından, normal matematikten daha fazlasını oluşturmanız gerekir öneririm. Zamanı değiştirerek ve MAC adresleriyle uğraşarak algoritmaya kasten vidalamadığınız sürece, bu durumda oldukça hızlı bir şekilde almalısınız - ancak bu girişlerle kasıtlı olarak karışıyor.
Jon Hanna

2
Bu v1 Guid idi. daha yeni MS GUID'leri V4'tür ve MAC adresini GUID oluşturma işleminin bir parçası olarak kullanmazlar. Zaman yine de bir faktör
Clinton Ward

16

[Bunun eski bir konu olduğunu anlıyorum, sadece biraz daha ayrıntı ekliyor] Mark ve Jon Hanna'nın iki cevabı, bazılarını ilgilendirse de, farklılıkları özetliyor

Guid.NewGuid()

Sonunda CoCreateGuid'i (Ole32'ye COM çağrısı) çağırır ( burada referanstır ) ve asıl çalışma UuidCreate tarafından yapılır .

Guid.Empty, bir Guid'in tüm sıfırları içerip içermediğini kontrol etmek için kullanılır. Bu, söz konusu Rehber'in değeri ile yeni Rehber () karşılaştırılarak da yapılabilir.

Benzersiz bir tanımlayıcıya ihtiyacınız varsa , cevap Guid.NewGuid () şeklindedir.


-2

Guid.NewGuid()amaçlandığı gibi GUID'ler oluşturur.

Guid.NewGuid()boş bir Guidnesne oluşturur , çağırarak başlatır CoCreateGuidve nesneyi döndürür.

new Guid() sadece boş bir GUID (tüm sıfırlar, sanırım) oluşturur.

Ben onlar yapıcı genel yapmak zorunda tahmin Guidbir olduğunu struct.


5
Yıllardır burada olan cevaplarda zaten mevcut olmayan hiçbir şeyi eklemeyen bir cevap eklemenin anlamı nedir?
Dinerdo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.