SQL Server: почему 15-й символ GUID всегда равен 4? - PullRequest
15 голосов
/ 17 февраля 2012

Мне просто любопытно, я всегда удивлялся, почему это так.

Пытаясь выяснить, смогу ли я создать его без символа 4 на 15-м персонаже, я запустил это ...

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

Как вы можете догадаться, это никогда не кончалось для меня. Все выходные я работал на сервере.

Если NewID должен всегда давать случайный идентификатор, почему эта цифра 4 всегда есть.

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

Является ли 15-я позиция своего рода идентификатором системы, сгенерировавшей уникальный идентификатор?

Фактически, то же самое происходит с функцией System.Guid.Newguid VB.net. 4 - это единственная вещь от Microsoft?

Редактировать: Возможно, мне следовало бы также спросить, действительно ли они уникальны? Можно ли полагаться, что они уникальны во всей базе данных? Я знаю, что системы баз данных основаны на предположении, что они гарантированно уникальны в базе данных. С несколькими миллионами записей в разных таблицах ... являются ли какие-либо из них потенциально одинаковыми?

Ответы [ 3 ]

9 голосов
/ 17 февраля 2012

4 указывает, что оно было сгенерировано с использованием псевдослучайного числа;См. Статью Википедии о глобально уникальных идентификаторах в алгоритме .

.
8 голосов
/ 17 февраля 2012

Это связано с версией UUID / GUID и тем, как она собрана. Полная информация о Википедии , резюме:

В каноническом представлении xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx старшие значащие биты N указывают вариант (в зависимости от варианта; используются один, два или три бита). Вариант, охватываемый спецификацией UUID, обозначается двумя старшими битами N, равными 1 0 (то есть шестнадцатеричное N всегда будет 8, 9, a или b).

В варианте, охватываемом спецификацией UUID, существует пять версий. Для этого варианта четыре бита M указывают версию UUID (то есть шестнадцатеричный M будет 1, 2, 3, 4 или 5).

...

Версия 4 (случайная)

UUID версии 4 используют схему, основанную только на случайных числах. Этот алгоритм устанавливает номер версии, а также два зарезервированных бита. Все остальные биты устанавливаются с использованием случайного или псевдослучайного источника данных.

UUID версии 4 имеют форму xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, где x - любая шестнадцатеричная цифра, а y - одно из 8, 9, A или B. Например, f47ac10b-58cc-4372-a567-0e02b2c3d479.

По сути, эта цифра является версией UUID, которая объясняет, как она была создана. 4 указывает на случайность, поэтому подразумевается, что MSSQL использует случайную генерацию (например, против MAC-адреса).

Я полагаю, хотя и не уверен, что большинство инструментов MS и, возможно, функции создания GUID WinAPI все создают UUID версии 4. Взглянув на рассеяние COM-идентификаторов COM, похоже, что это так.

7 голосов
/ 17 февраля 2012

GUID не являются полностью случайными; они генерируются в соответствии с конкретным алгоритмом , который несколько варьируется в зависимости от версии GUID.

В частности, когда первая цифра третьей группы равна 4, это означает, что это GUID v4.

...