SQL Server:为什么GUID的第15个字符总是4?

Ela*_*rys 16 sql-server guid uniqueidentifier

我只是好奇,我一直想知道为什么会这样.

为了找出我是否可以在第15个角色创建一个没有角色4的人,我跑了这个......

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
Run Code Online (Sandbox Code Playgroud)

正如你可能猜到的,这实际上从未真正结束.我整个周末都在服务器上运行.

如果NewID应该总是给出一个随机ID,为什么那个4总是在那里.

BC13DF1C-60FB-41C2-B5B2-8F1A73CF2485
D790D359-AB3D-4657-A864-FA89FACB3E99
DF1BBC0C-4205-48E8-A1B6-EA9544D7C6E5
Run Code Online (Sandbox Code Playgroud)

对于生成uniqueidentifier的系统,第15个位置是否有某种识别?

实际上,VB.net的System.Guid.Newguid功能也是如此.4是微软唯一的东西吗?

编辑:也许我也应该问,他们真的是独一无二的吗?一个人可以依赖它们在整个数据库中是唯一的吗?我知道基于这些假设的数据库系统,这些系统在数据库中是唯一的.在不同的表中有数百万条记录......它们中的任何一条都可能相同吗?

Chr*_*fer 9

4表示它是使用伪随机数生成的; 请参阅Wikipedia关于算法下全局唯一标识符的文章.


ssu*_*ube 9

它与UUID/GUID版本及其组合方式有关.关于维基百科的全部细节,摘要:

在规范表示中,xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx,N的最高有效位表示变体(取决于变体;使用一个,两个或三个位).由UUID规范覆盖的变体由N的两个最高有效位表示为10(即,十六进制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创建函数都创建版本4 UUID.看一下散布的COM GUID,看起来就是这种情况.


Mic*_*sen 7

GUID不是完全随机的; 它们是根据特定算法生成的,根据GUID版本的不同而有所不同.

具体地说,当第三组的第一个数字是4时,表示它是v4 GUID.