2010-04-11 9 views
5

Matematycznie, przypuszczam, że możliwe jest, że nawet dwa losowe identyfikatory GUID wygenerowane za pomocą metody wbudowanej w platformie .NET są identyczne, ale z grubsza, jak prawdopodobne jest ich zderzenie, jeśli wygenerujesz setki lub tysiące?Ile razy można losowo wygenerować identyfikator GUID przed ryzykiem duplikatów? (.NET)

Jeśli wygenerowałeś jeden na każdą kopię systemu Windows na świecie, czy by się zderzyły?

Powodem, dla którego pytam, jest to, że mam program, który tworzy wiele obiektów i niszczy również niektóre, i zastanawiam się, czy którekolwiek z tych obiektów (w tym te zniszczone) mają identyczne identyfikatory GUID.

+0

Możesz to odkryć: http://weblogs.asp.net/leftslipper/archive/2010/04/01/last-guid-used-up-new-scottguid-unique-id-to-replace-it .aspx – philsquared

Odpowiedz

7

Dostępne są ~ 3E38 możliwych wartości identyfikatora GUID. Ale urodzinowy paradoks obniża szanse 50/50 na tworzenie duplikatu GUID do ~ 1E19. Chociaż wciąż jest to ogromna liczba, porównując dość korzystnie do prawdopodobieństwa, że ​​twoja maszyna zostanie zniszczona przez uderzenie meteorytu jako pierwsze, zegar systemowy jest używany, aby zapewnić, że nie wystąpią duplikaty.

Wiele dużych i krytycznych aplikacji DBase używa identyfikatora GUID jako klucza głównego w tabeli.Nie wahaj się podążać za ich przykładem.

+0

Nie wszystkie rodzaje identyfikatorów GUID korzystają z zegara systemowego. Stąd zderzenie jest możliwe teoretycznie. – user192472

+0

Guidy nie używają zegarów, generatory Guid. W tym tygodniu wybuchł meteor na Wisconsin, dość spektakularnie. Podobała mi się opinia mojego ojca na temat takich teorii: "Jeśli niebo spadnie, wszyscy będziemy nosić niebieski kapelusz". –

+0

A jeśli dostaniesz dupę, kup wiele biletów lotto – PostMan

5

Identyfikator GUID zawiera składniki oparte na

  • czasu (zegar systemowy)

  • Kosmiczna (adres systemu MAC)

  • Liczby losowe

Więc jeśli ktoś jest generowany dla każdej maszyny na świecie w tym samym czasie, będą się różnić er przez ich adresy MAC i losowe

Oto pomocne łącze. http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

+0

Och, wow, nigdy nie zdawałam sobie sprawy, że to było takie skomplikowane. Zakładam, że była to tylko jedna duża liczba losowa;) Jeśli wszystkie GUID są generowane w jednym programie, prawdopodobnie usuwa część MAC, a losowe liczby + czas pozostały ... Nadal wyjątkowe? A przynajmniej wystarczająco unikatowe? – NibblyPig

+0

liczba losowa = 7 – knoopx

+0

Nie wszystkie identyfikatory GUID mają taką strukturę, chociaż wydaje się, że jest to rozsądny wybór. –

0

Wystarczy dodać do właściwej odpowiedzi Midhat, oto cytat z Eric Lippert's Blog o sytuacji, w której nie ma karty sieciowej zainstalowanej w systemie (w związku z tym, nie ma adresu MAC):

(maszyny, które robią nie mają kart sieciowych generujących specjalnych identyfikatorów GUID, które znajdują się w zasięgu "znanym jako potencjalnie nie unikalny").

+4

Identyfikatory GUID nie zostały wygenerowane za pomocą adresu MAC przez długi czas. Robak Melissa zajął się tym. –

+0

Och, dziękuję, nie myślałem o tym jako o luce w zabezpieczeniach, będę teraz studiował wikipedię. – n535

1

Trudno jest obliczyć szanse, nie znając wewnętrznych szczegółów implementacji generatora GUID.

Możesz użyć numeru combinatorics, ale to tylko pomoże ci założyć, że kombinacje są równie prawdopodobne. Dlatego bez statystycznej wiedzy o implementacji trudno byłoby określić rzeczywiste szanse.

W przeciwieństwie do tego, co sugeruje Midhat (jeśli rozumiałem go poprawnie), możliwe są kolizje GUID. Wbudowane generatory liczb losowych są zwykle implementowane przy użyciu nasienia opartego na sygnaturach czasowych. Adresy MAC nie są z natury unikalne, ponieważ mogą być nadpisane w wielu sytuacjach (i są, przynajmniej w niektórych przypadkach, o których wiem). Możliwe, że dwa generatory GUID uzyskają takie same dane wejściowe, a tym samym wygenerują takie same dane wyjściowe.

Identyfikatory GUID mają 128-bitową długość, więc "jest wystarczająco dużo, aby każdy mógł z nich korzystać", ale to nie gwarantuje, że kolizje nie wystąpią.

1

Po ostatnich 25 latach pracy z RPC i COM (gdzie identyfikatory GUID i UUID są krytyczne) i pracy z rozproszonymi bazami danych, w których identyfikatory GUID są używane jako unikalne identyfikatory wierszy, nigdy nie napotkałem problemu kolizji - niezależnie od tego, czy zostały wygenerowane na pojedyncze maszyny lub różne maszyny. Kolejna ciekawa propozycja z MSDN, w której jako rowidy są one znacznie dłuższe niż obiekty: http://weblogs.asp.net/wwright/archive/2007/11/04/the-gospel-of-the-guid-and-why-it-matters.aspx

0

To nie jest coś, czym powinniście się w ogóle zainteresować. To tylko heurystyka dostępności w pracy. To "ryzyko", które znasz i rozpoznajesz, więc chcesz się tym zająć. Ale istnieje wiele innych zagrożeń, które są miliony razy bardziej prawdopodobne, że nadal nie martwimy się. Wspaniała książka Pro Git mówi najlepiej, myślę:

Istnieje większe prawdopodobieństwo, że każdy członek zespołu programistycznego zostanie zaatakowany i zabity przez wilki w niezwiązanych ze sobą incydentach tej samej nocy.

Będziesz musiał wygenerować milion lub miliard, aby nawet być odległą możliwością.

+0

, co jest dość niepokojące, jeśli jesteś jednomyślnym zespołem pracującym w głębokim lesie w starej, cholernej chacie. – philsquared

Powiązane problemy