SQL Server: почему 15-й символ GUID всегда 4?

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

в попытке выяснить, могу ли я создать один без символа 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-й позиции какой-то определить, как к системе это породило uniqueidentifier?

на самом деле, то же самое происходит с VB.net s

3 ответов


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


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

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

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

...

версия 4 (random)

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. Взглянув на разбросанные ком-GUID, это, по-видимому, так.


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

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