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

时间:2012-02-17 17:19:12

标签: 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

正如你可能猜到的那样,这对我来说实际上并没有结束。我整个周末都在服务器上运行。

如果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是微软唯一的东西吗?

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

3 个答案:

答案 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。