2012-02-17 10 views
12

Jestem po prostu ciekawy, zawsze zastanawiałem się, dlaczego tak się dzieje.Serwer SQL: dlaczego 15 znak GUID jest zawsze 4?

Próbując dowiedzieć się, czy mogę utworzyć bez charakteru 4 na 15 znaków, to wpadłem ...

DECLARE @GUID AS NVARCHAR(36) 
DECLARE @COUNT AS INTEGER 

SET @COUNT = 0 
SET @GUID = CAST(NEWID() AS NVARCHAR(36)) 

WHILE SUBSTRING(@GUID,15,1) = '4' 
BEGIN 
    SET @COUNT = @COUNT + 1 
    SET @GUID = CAST(NEWID() AS NVARCHAR(36)) 
END 

PRINT 'Attempts : ' + CAST(@COUNT AS NVARCHAR(MAX)) 
PRINT @GUID 

Jak można się domyślić, to nigdy nie skończyła się dla mnie. Miałem to działa na serwerze przez cały weekend.

Jeśli NewID ma zawsze dawać losowy identyfikator, dlaczego 4 zawsze tam jest.

BC13DF1C-60FB-41C2-B5B2-8F1A73CF2485 
D790D359-AB3D-4657-A864-FA89FACB3E99 
DF1BBC0C-4205-48E8-A1B6-EA9544D7C6E5 

Czy 15. pozycja jest pewnego rodzaju identyfikacją systemu, który wygenerował unikatowy identyfikator?

W rzeczywistości to samo dzieje się z funkcją VB.net o nazwie System.Guid.Newguid. Czy 4 to tylko Microsoft?

Edycja: Być może powinienem był również zapytać, czy są rzeczywiście unikatowe? Czy można polegać na tym, że są unikatowe w całej bazie danych? Znam systemy baz danych oparte na założeniu, że są one gwarantowane jako unikalne w bazie danych. Z kilkoma milionami rekordów w różnych tabelach ... czy którekolwiek z nich są potencjalnie takie same?

Odpowiedz

7

Symbol 4 oznacza, że ​​został wygenerowany przy użyciu liczby pseudolosowej; Zobacz Wikipedia's article for Globally Unique Identifiers under Algorithm.

+0

Widzę to, pod V4 GUID. Zawsze była to moja ciekawość, ponieważ uważałem je za wyjątkowe. A jeśli jeden bajt jest zawsze taki sam, w jaki sposób newid może wygenerować unikalny identyfikator bazy danych. Z pewnością musi istnieć szansa na wygenerowanie już używanego. – Elarys

+1

Szanse na wygenerowanie tej samej liczby dwa razy są dość niskie, a algorytmy, z których korzystają (które 4 określa jeden konkretny algorytm) pomagają jeszcze bardziej zmniejszyć szanse na duplikat. Pomyśl o tobie i przyjacielu za każdym rzutem monety i uzyskując za każdym razem te same wyniki za 122 przerzucenia z rzędu ... –

+0

(Mam 122 z RFC połączonego na wikipedii - bity 6, 7 i 12-15 są ustawione na określone wartości, a pozostałe bity (128-6) są losowo wybrane). –

7

Identyfikatory GUID nie są całkowicie losowe; są generowane zgodnie z a specific algorithm, co zmienia się nieco w zależności od wersji GUID.

W szczególności, gdy pierwsza cyfra trzeciej grupy wynosi 4, oznacza to, że jest to GUID v4.

8

Jest to związane z wersją UUID/GUID i sposobem jej złożenia. Full details on Wikipedia, Podsumowanie:

w reprezentacji kanonicznej XXXXXXXXXXXX-Mxxx-Nxxx-XXXXXXXXXXXX, najbardziej znaczących bitów N oznacza wariantu (w zależności od wariantu, jeden, dwa lub trzy bity są używane). Wariant objęty specyfikacją UUID jest wskazany przez dwa najbardziej znaczące bity N wynoszące 1 0 (to znaczy liczba szesnastkowa N zawsze będzie wynosić 8, 9, a lub b).

W wariancie uwzględnionym w specyfikacji UUID dostępnych jest pięć wersji. W tym wariancie cztery bity M oznaczają wersję UUID (to znaczy szesnastkowe M będzie albo 1, 2, 3, 4, albo 5).

...

wersji 4 (losowo)

Wersja 4 UUID używać schematu polegając tylko na liczb losowych. Algorytm ten ustawia numer wersji oraz dwa zarezerwowane bity. Wszystkie inne bity są ustawiane przy użyciu losowego lub pseudolosowego źródła danych.

Wersja 4 Identyfikatory UUID mają postać xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, gdzie x jest dowolną cyfrą szesnastkową, a y jest jedną z 8, 9, A lub B. f47ac10b-58cc-4372-a567-0e02b2c3d479.

Zasadniczo ta cyfra to wersja UUID, która wyjaśnia, w jaki sposób została utworzona.4 wskazuje losowo, więc sugeruje się, że MSSQL używa generowania losowego (na przykład w porównaniu z adresem MAC).

Uważam, choć nie jestem pewien, że większość narzędzi MS i prawdopodobnie funkcje tworzenia GUID WinAPI tworzą wszystkie UUID wersji 4. Patrząc na rozproszenie identyfikatorów COM, wydaje się, że tak właśnie jest.