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.