Подтвердить что ты не робот

SQL Server: почему 15-й char 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 должен всегда давать случайный идентификатор, почему это так всегда.

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

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

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

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

4b9b3361

Ответ 2

Это связано с версией 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 (случайная)

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

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

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

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

Ответ 3

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

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