全局唯一标识符简称GUID

来源:http://www.tabletreviewspecs.com 作者: 2017-09-26 02:37

  ),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数。GUID一词有时也专指微软UUID标准的实现。

  GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机计算机集群都不会生成两个相同的GUID。GUID的总数也足够大,达到了2128(3.4×1038)个,所以随机生成两个相同GUID的可能性常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以这种重复的情况不会发生。(见算法章节)

  GUID本质上是一个16字节(128位)的二进制数,最常见[1]的结构如下:

  数据4的字节序和GUID显示成文本的结果相同,而其它3个数据在小端序的机器(如英特尔的CPU)上必须先转换成大端序。

  当需要使用更少的字符表示GUID时,可能会使用Base64Ascii85编码。Base64编码的GUID有22-24个字符,如:

  在软件基金会为计算(第一版)GUID制定的算法中,用户的被用于计算GUID中最后一组数字,所以就存在隐私问题,因为任何人都可以通过文件包含的GUID追溯到最初创建这个文件的电脑。这个漏洞曾被用于寻找梅丽莎病毒的制作者的[2]。在其它几组数字中,大多数是根据生成GUID的时间决定的。

  第四版的GUID使用了新的算法,其产生的数字是一个伪随机数。它生成的GUID的第三组数字的第一位是4,如{38a52be4-9352-453e-af97-5c3b448652f0}。对Windows API中的GUID生成器所做密码分析显示,因为第四版的GUID并不是真正随机的,所以只要知道了程序内部的全部状态,就可能预测它生成的上一个和下一个GUID的。[3].

  GUID已经广泛使用于数据库表的主键。由于主键需要用作索引,于是就产生了一个性能问题:当主键足够随机时,新的记录就必须插入到原有的索引中间,而不能仅仅排在最后。

  为缓解这个问题并仍然提供足够的随机程度以避免GUID的重复,人们就创造了一些新的算法来生成序列化的GUID。

  2002年8月,吉米尔森(Jimmy Nilsson)给出了第一种方法,[4]并称之为“COMB”(combined guid/timestamp,意思是:组合GUID/时间截)。他将GUID中数据4的最后6字节用系统时间的最低位替换。经测试,这对随机性的影响很小,但是有一个副作用即是其创建的时间可以从GUID中轻松还原。

  自从Microsoft SQL Server2005版开始,微软Transact-SQL中加入了一个新函数,叫做NEWSEQUENTIALID()[5],用来生成主键增大的GUID,但一旦服务器重新启动,其再次生成的GUID可能反而变小(但仍然保持唯一)。这在很大程度上提高了索引的性能,但并不能所生成的GUID已知增大。这个函数产生的GUID很简单就可以预测,因此不适合用于安全目的。

  2006年,一些程序员发现,在一些平台上的Oracle软件中,SYS_GUID函数能返回序列化的GUID。但这个实际上是一个BUG导致的。[6].