我只是好奇,我一直想知道为什么会这样。
为了找出我是否可以在第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
正如你可能猜到的那样,这对我来说实际上并没有结束。我整个周末都在服务器上运行。
如果NewID应该总是给出一个随机ID,为什么那个4总是存在。
BC13DF1C-60FB-41C2-B5B2-8F1A73CF2485
D790D359-AB3D-4657-A864-FA89FACB3E99
DF1BBC0C-4205-48E8-A1B6-EA9544D7C6E5
对于生成uniqueidentifier的系统,第15个位置是否有某种识别?
事实上,VB.net的System.Guid.Newguid
函数也会发生同样的事情。 4是微软唯一的东西吗?
答案 0 :(得分:9)
4表示它是使用伪随机数生成的;请参阅Wikipedia's article for Globally Unique Identifiers under Algorithm。
答案 1 :(得分:8)
它与UUID / GUID版本及其组合方式有关。 Full details on Wikipedia,摘要:
在规范表示中,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创建函数都创建了版本4 UUID。看一下散布的COM GUID,情况似乎就是这样。
答案 2 :(得分:7)
GUID并非完全随机;它们是根据a specific algorithm生成的,根据GUID版本的不同而有所不同。
具体来说,当第三组的第一个数字是4时,表示它是v4 GUID。