Czy kolizje GUID są możliwe?

Pracuję nad bazą danych w SQL Server 2000, która używa GUID dla każdego użytkownika, który używa aplikacji, z którą jest powiązana. W jakiś sposób dwóch użytkowników skończyło z tym samym GUID. Wiem, że microsoft używa algorytmu do generowania losowego GUID, który ma bardzo małą szansę na spowodowanie kolizji, ale czy kolizja jest nadal możliwa?

Author: nietonfir, 2008-10-09

16 answers

W zasadzie nie. Myślę, że ktoś namieszał w Twojej bazie danych. W zależności od używanego identyfikatora GUID wersji wartość jest albo unikalna (dla takich identyfikatorów GUID wersji 1), albo zarówno unikalna, jak i nieprzewidywalna (dla takich identyfikatorów GUID wersji 4). Implementacja SQL Server dla ich funkcji nevid() wydaje się używać 128-bitowej liczby losowej, więc nie dojdzie do kolizji.

Aby uzyskać 1% szans na kolizję, musisz wygenerować około 2,600,000,000,000,000 GUIDs.

 114
Author: Tom Ritter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-22 03:31:40

W zasadzie nie są one możliwe !, szanse są astronomicznie niskie .

Ale... Jestem jedyną osobą na świecie, o której znam, która miała GUID colision raz (yep!).

I jestem tego pewien, i że to nie był błąd.

Jak to się stało, w małej aplikacji, która była uruchomiona na Pocket PC, na końcu operacji musi być wydane polecenie, które ma wygenerowany GUID. Polecenie po wykonaniu na serwerze było przechowywane w tabeli poleceń na serwerze wraz z datą wykonania. Pewnego dnia, kiedy debugowałem wydałem komendę modułu (z dołączonym nowo wygenerowanym GUID) i nic się nie stało. Zrobiłem to ponownie (z tym samym guidem, ponieważ guid został wygenerowany tylko raz na początku operacji), i znowu, i nic, w końcu próbując dowiedzieć się, dlaczego komenda nie jest wykonywana, sprawdziłem tabelę poleceń, a ten sam GUID jak obecny został wstawiony 3 tygodnie temu. Nie wierząc to, przywróciłem bazę danych z kopii zapasowej 2 tygodni, i guid tam był. Sprawdziłem kod, nowy guid został świeżo wygenerowany bez żadnych wątpliwości. Kolizja Pow guid, zdarzyła się tylko raz, ale naprawdę żałuję, że nie wygrałem w lotto, szansa jest większa :).

Edit: istnieją pewne czynniki, które mogły znacznie zwiększyć szansę na to, że aplikacja była uruchomiona na emulatorze PocketPC, a emulator ma funkcję zapisu stanu, co oznacza, że za każdym razem, gdy stan jest przywracany czas lokalny jest również przywracany i guid jest oparty na wewnętrznym timerze....również algorytm generujący guid dla compact framework może być mniej kompletny niż na przykład COM...

 85
Author: Pop Catalin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 21:39:41

Są teoretycznie możliwe, ale przy 3. 4e38 możliwych liczb, jeśli utworzysz dziesiątki bilionów GUID w ciągu roku szansa na posiadanie jednego duplikatu wynosi 0.00000000006 (Źródło ).

Jeśli dwóch użytkowników skończy z tym samym GUID, założę się, że jest błąd w programie, który powoduje, że dane są kopiowane lub udostępniane.

 27
Author: Ben Hoffstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 21:06:54

Najpierw przyjrzyjmy się możliwości zderzenia dwóch GUID. Nie jest to, jak stwierdziły inne odpowiedzi, 1 na 2^128 (10^38) Z powodu paradoksu urodzinowego, co oznacza, że dla 50% szansy na zderzenie dwóch Guidów prawdopodobieństwo jest rzeczywiście 1 na 2^64 (10^19), co jest dużo mniejsze. Jednak jest to nadal bardzo duża liczba i jako takie prawdopodobieństwo kolizji zakładając, że używasz rozsądnej liczby GUID jest niskie.

Zauważ również, że GUID nie zawierają znacznika czasu lub adres MAC, jak wiele osób również wydaje się wierzyć. Tak było w przypadku GUID v1, ale teraz używane są GUID v4, które są po prostu pseudolosową liczbą, co oznacza, że możliwość kolizji jest prawdopodobnie wyższa, ponieważ nie są już unikalne dla czasu i maszyny.

Więc zasadniczo odpowiedź brzmi tak, kolizje są możliwe. Ale są one bardzo mało prawdopodobne.

Edit: fixed to say 2^64

 19
Author: Greg Beech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-13 11:47:29

Szansa na zderzenie dwóch przypadkowych GUID (~1 na 10^38) jest mniejsza niż szansa na nie wykrycie uszkodzonego pakietu TCP/IP (~1 na 10^10). http://wwwse.inf.tu-dresden.de/data/courses/SE1/SE1-2004-lec12.pdf , Strona 11. Dotyczy to również napędów dyskowych, napędów cd itp...

Guid są statystycznie unikalne, a dane odczytane z db są tylko statystycznie poprawne.

 16
Author: Tony Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 22:44:58

Uznałbym brzytwę Occama za dobry przewodnik w tym przypadku. Jest bardzo mało prawdopodobne, że masz kolizję GUID. Jest znacznie bardziej prawdopodobne, że masz błąd lub ktoś miesza z Twoimi danymi.

 13
Author: Jason Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 23:05:50

Zobacz artykuł w Wikipedii globalnie unikalny identyfikator . Istnieje kilka sposobów generowania identyfikatorów GUID. Najwidoczniej stare (?) używany adres Mac, znacznik czasu do bardzo krótkiej jednostki i unikalny licznik (do zarządzania szybkimi generacjami na tym samym komputerze), więc ich duplikowanie jest prawie niemożliwe. Ale te GUID zostały porzucone, ponieważ mogły być używane do śledzenia użytkowników...

Nie jestem pewien nowego algorytmu używanego przez Microsoft (artykuł mówi, że sekwencja GUID może być przewidywane, wygląda na to, że nie używają już znacznika czasu? Artykuł Microsoft linkowany powyżej mówi coś innego...).

Teraz, GUID są starannie zaprojektowane, aby być, z nazwy, unikalne globalnie, więc zaryzykuję, że jest to niemożliwe, lub bardzo bardzo bardzo niskie prawdopodobieństwo. Poszukałbym gdzie indziej.

 11
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 22:15:06

Dwie maszyny Win95, które mają karty ethernet z duplikatami adresów MAC, wydadzą duplikaty GUID w ściśle kontrolowanych warunkach, zwłaszcza jeśli, na przykład, zasilanie wyłącza się w budynku i obie uruchamiają się dokładnie w tym samym czasie.

 9
Author: Joshua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-08 15:36:43

Wiem, że ludzie lubią dobrą odpowiedź, że GUID są magiczne i gwarantowane, że są wyjątkowe, ale w rzeczywistości większość GUID to tylko 121-bitowe liczby losowe (siedem bitów marnuje się na formatowanie). Jeśli nie czujesz się komfortowo używając dużej liczby losowej, nie powinieneś czuć się komfortowo używając GUID.

 4
Author: Rick Yorgason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-27 07:40:38

Czy kod użyty do wygenerowania GUID może mieć w sobie błąd? Oczywiście, że może. Ale odpowiedź jest taka sama jak w przypadku błędu kompilatora - Twój własny kod jest o rząd wielkości bardziej podatny na błędy, więc spójrz tam najpierw.

 3
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 21:36:14

Oczywiście, że to możliwe....Prawdopodobne? Mało prawdopodobne, ale to możliwe.

Pamiętaj, że ta sama maszyna generuje każdy GUID (serwer), więc wiele" przypadkowości", która jest oparta na konkretnych informacjach maszyny jest tracona.

 2
Author: FlySwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 21:06:23

Tylko dla grins, spróbuj następujący skrypt... (działa na SQL 2005, nie jestem pewien co do 2000)

declare @table table
(
    column1 uniqueidentifier default (newid()),
    column2 int,
    column3 datetime default (getdate())
)

declare @counter int

set @counter = 1

while @counter <= 10000
begin
    insert into @table (column2) values (@counter)
    set @counter = @counter + 1
end

select * from @table

select * from @table t1 join @table t2 on t1.column1 = t2.column1 and t1.column2 != t2.column2

Wielokrotne uruchomienie (zajmuje mniej niż sekundę) daje dość szeroki zakres od pierwszego wyboru, nawet z bardzo krótką przerwą czasową. Do tej pory drugi select niczego nie wyprodukował.

 1
Author: GalacticCowboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-31 15:02:09

Niemożliwe, jeśli użytkownicy mają różne maszyny z kartami sieciowymi, a nawet jeśli nie jest to nadal skrajnie marginalne, niemal teoretyczne ryzyko.

Osobiście poszukałbym gdzie indziej, ponieważ jest to raczej bug niż GUID clash...

Oczywiście pod warunkiem, że nie odcina się bitów z GUID, aby go skrócić.

 0
Author: Richard Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 21:00:18

Jasne, że to możliwe, a może nawet prawdopodobne. To nie jest tak, że każdy GUID jest w przypadkowej części możliwej przestrzeni liczbowej. W przypadku, gdy dwa wątki spróbują wygenerować jeden jednocześnie, z wyjątkiem pewnego rodzaju scentralizowanej funkcji GUID z semaforem wokół niego, mogą skończyć z tą samą wartością.

 0
Author: Kirk Strauser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 21:11:00

Poprzedzę to słowami "nie jestem osobą networkingową, więc mogę tworzyć całkowicie niespójne zdania.".

Kiedy pracowałem na Illinois State University, mieliśmy dwa komputery Dell, zamówione o różnych porach. Pierwszy umieściliśmy w sieci, ale kiedy próbowaliśmy umieścić drugi w sieci, zaczęliśmy otrzymywać szalone błędy. Po wielu problemach ustalono, że obie maszyny produkują ten sam GUID (nie jestem pewien dokładnie po co, ale to sprawiło, że oba są bezużyteczne w sieci). Dell faktycznie wymienił oba urządzenia jako wadliwe.
 0
Author: John Kraft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-08 21:16:56

Jest bardzo mało prawdopodobne, że napotkasz kolizje GUID, jeśli generujesz je za pomocą czegoś takiego jak funkcja NEWID() w SQL Server(choć oczywiście możliwe, jak podkreślały inne odpowiedzi). Jedną z rzeczy, na którą nie zwrócili uwagi, jest to, że jest całkiem prawdopodobne, że napotkasz kolizje, jeśli generujesz GUID w JavaScript w przeglądarkach na wolności. Nie tylko są czasami problemy w RNG w różnych przeglądarkach, ale mam również napotkać problemy, gdzie Google pająki zdają się buforować wyniki takich funkcji, a skończyło się na wielokrotnym przekazywaniu tego samego GUID do naszych systemów.

Zobacz różne odpowiedzi tutaj, aby uzyskać więcej szczegółów:

Kolizje podczas generowania uuid w JavaScript?

 0
Author: Ken Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:20