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?
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
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 ... –
(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). –