W jednym z projektów pracuję nad następującym schematem, który pojawia się dość regularnie:
var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
guid = Guid.NewGuid().ToString();
}
Chociaż rozumiem, że aa GUID nie jest gwarantowana być unikalny i zgodnie z dokumentacji MSDN generowane GUID może być zerowy , jest to praktyczny wzajemne rzeczywiście warto wysyłania cykle testowe zarówno w obliczeniowej sensie i pod względem czasu deweloper o tym myśleć ?
Odpowiedzi:
Sugerowałbym, że nie warto sprawdzać Guid.Empty. Dokumenty Guid.NewGuid z jakiegoś powodu wspominają o tym
Guid.NewGuid to opakowanie dla interfejsu API CoCreateGuid interfejsu API Win32 , w którym nie ma wzmianki o zwracaniu wszystkich zer.
Raymond Chen idzie dalej , sugerując to
Więc nie, nie martwiłbym się tym. Nie zgaduję, dlaczego doktorzy Guid.NewGuid nawet o tym wspominają.
źródło
Jeśli okaże się
Guid.NewGuid() == Guid.Empty
, że wygrałeś najtrudniejszą loterię na ziemi. Nie zawracaj sobie głowy sprawdzaniem unikatowości i kolizji. Nie mając na to jest to, co GUID są za . Oszczędzę ci matematyki, jest wszędzie w sieci.Ponadto prowadnice systemu Windows zawsze mają jedną „cyfrę” równą
4
. Przewodniki mają pewną strukturę.Ten fragment kodu, który opublikowałeś, wygląda na to, że jeden programista zapomniał zainicjować
Guid
zmienną i stwierdził, że tak jestGuid.Empty
. Pomyłkowo zidentyfikowałGuid.NewGuid()
jako przyczynę. Teraz na zawsze zabobonnie w to uwierzy.W każdym razie jest to niewłaściwe pytanie. Jestem pewien, że Twój kod nie zależy nie tylko od rysowania,
Guid.Empty
ale także od wyjątkowości. Tawhile
pętla nie wymusza wyjątkowości. Przewodniki mają zapewnić wyjątkową wartość bez koordynacji. To jest ich przypadek użycia.źródło
Spójrz na kod źródłowy
Guid.NewGuid
metody :Widzisz umowę kodową?
Guid.NewGuid
Metoda nie daje pusty GUID.źródło
Jeśli zamierzasz sprawdzić identyfikator GUID z zerowym identyfikatorem GUID, zgodnie z tą samą logiką należy również dołożyć należytej staranności, sprawdzając go względem wszystkich innych identyfikatorów GUID w aplikacji (ponieważ prawdopodobieństwo uzyskania zera powinno być takie samo jak prawdopodobieństwo uzyskiwanie dowolnego innego identyfikatora GUID w aplikacji *). Musisz to zrobić, aby udowodnić, że aksjomat, pod którym działasz, jest taki, że ten GUID będzie unikalny (co w rzeczywistości jest tym samym aksjomatem, co testowanie vs 0).
Oczywiście robienie tego jest absurdalne.
TLDR; Jeśli możesz zaufać NewGuid (), aby uzyskać unikalne wyniki, możesz również zaufać, że nie wygeneruje żadnego znanego GUID.
* Jego prawdopodobieństwo nie jest takie samo, jak GUID .NET zawsze pasuje do następujących,
{________-____-4___-____-____________}
więc NewGuid NIGDY nie wygeneruje guid zeroDla zabawy zaproponowałem ulepszenie dokumentacji tutaj: http://feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid
źródło