**全局唯一标识符**（英語：，缩写：**GUID**；发音为/ˈɡuːɪd/或/ˈɡwɪd/）是一种由算法生成的唯一标识，通常表示成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位）的二进制数，最常见的结构如下：

| 位 | 字节 | 描述 | 字节序 |
| --- | --- | --- | --- |
| 32 | 4 | 数据1 | 原生 |
| 16 | 2 | 数据2 | 原生 |
| 16 | 2 | 数据3 | 原生 |
| 64 | 8 | 数据4 | 大端序 |

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

数据4的第一个字节的第1-3位表示所使用的GUID变种类型：

| 模式 | 描述 |
| --- | --- |
| 0 | 向后兼容网络计算系统 |
| 10 | 标准 |
| 110 | 向后兼容微软组件对象模型 |
| 111 | 保留至将来使用 |

数据3最高的4位表示版本号和所使用的算法。

文本编码
----

GUID通常会写成16进制数的字符串，如：

3F2504E0-4F89-11D3-9A0C-0305E82C3301
这种文本表示包括了如下部分：

| 16进制数的位数 | 描述 |
| --- | --- |
| 8 | 数据1 |
| 4 | 数据2 |
| 4 | 数据3 |
| 4 | 数据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"，如：

算法
--

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

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

第四版的GUID使用了新的算法，其产生的数字是一个伪随机数。它生成的GUID的第三组数字的第一位是4，如{38a52be4-9352-**4**53e-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)

1. ↑ .  [2010-06-27]. （原始内容存档于2010-06-23）.
2. ↑   (新闻稿). ZDNet. 1999-04-02  [2010-06-27]. （原始内容存档于2012-10-21）.
3. ↑ .  [2010-06-27]. （原始内容存档于2010-05-31）.
4. ↑ .  [2010-06-27]. （原始内容存档于2010-08-26）.
5. ↑ .  [2010-06-27]. （原始内容存档于2010-06-06）.
6. ↑ .  [2010-06-27]. （原始内容存档于2011-07-08）.

参见
--

* UUID
* Security Identifier（英语：） (SID)
* Object identifier（英语：） (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（页面存档备份，存于）