全局唯一标识符

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

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

 实例 
 Windows操作系统使用GUID来标识COM对象中的类和界面。一个脚本可以不需知道DLL的位置和名字直接通过GUID来激活其中的类或对象。
 英特尔的全局唯一标识分区表使用GUID来标识硬盘和分区。
 微软的ActiveX使用UUID来标识每一个不同的浏览器控件。

 基本结构 
GUID本质上是一个16字节（128位）的二进制数，最常见的结构如下：
位字节描述字节序324数据1原生162数据2原生162数据3原生648数据4大端序
数据4的字节序和GUID显示成文本的结果相同，而其它3个数据在小端序的机器（如英特尔的CPU）上必须先转换成大端序。

数据4的第一个字节的第1-3位表示所使用的GUID变种类型：
模式描述0向后兼容网络计算系统10标准110向后兼容微软组件对象模型111保留至将来使用
数据3最高的4位表示版本号和所使用的算法。

 文本编码 

GUID通常会写成16进制数的字符串，如：
3F2504E0-4F89-11D3-9A0C-0305E82C3301

这种文本表示包括了如下部分：
16进制数的位数描述8数据14数据24数据34数据4的最初2字节12数据4的剩余6字节

上述表示方法通常放在一对大括号里边，如：
{3F2504E0-4F89-11D3-9A0C-0305E82C3301}

当需要使用更少的字符表示GUID时，可能会使用Base64或Ascii85编码。Base64编码的GUID有22－24个字符，如：

7QDBkvCA1+B9K/U0vrQx1A
7QDBkvCA1+B9K/U0vrQx1A==

Ascii85编码后是20个字符，如：

5:$Hj:Pf\4RLB9%kU\Lj

在URN中，GUID第一版的名字空间标识是"uuid"，如：

 urn:uuid:3F2504E0-4F89-11D3-9A0C-0305E82C3301

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

我们可以通过GUID中第三组数字的第一位是不是1来判断它是否是第一版的GUID算法生成的，例如{2f1e4fc0-81fd-11da-9156-00036a0f876a}。

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

 序-{}-列化算法 

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

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

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

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

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

 参考资料 

 A Universally Unique IDentifier (UUID) URN Namespace (IETF RFC 4122)
 Globally Unique Identifiers - Internal Structure (Microsoft)

 参见 
 UUID
  (SID)
  (OID)
 裝置指紋

 外部链接 

 CLSID Registry Key Information
 International Standard "Generation and registration of Universally Unique Identifiers (UUIDs) and their use as ASN.1 Object Identifier components" (ITU-T Rec. X.667 | ISO/IEC 9834-8, technically compatible with IETF RFC 4122)
 DmaId for InstanceId Values (DCE Universally Unique IDentifiers, UUIDs)
 Syntax and semantics of the DCE variant of Universal Unique Identifiers (UUIDs)
 Generate and parse UUIDs (or GUIDs) in Java
 UUID Generator on the ITU-T website

Category:Windows管理
Category:識別符
Category:唯一識別符