fbpx
维基百科

全局唯一标识符

全局唯一标识符(英語:Globally Unique Identifier,缩写: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位)的二进制数,最常见[1]的结构如下:

字节 描述 字节序
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",如:

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

算法 编辑

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

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

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

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

参考资料 编辑

  • Globally Unique Identifiers - Internal Structure (Microsoft)
  1. ^ . [2010-06-27]. (原始内容存档于2010-06-23). 
  2. ^ Tracking Melissa's alter egos (新闻稿). ZDNet. 1999-04-02 [2010-06-27]. (原始内容于2012-10-21). 
  3. ^ Design and Cryptanalysis of UUID-generator in Windows. [2010-06-27]. (原始内容于2010-05-31). 
  4. ^ InformIT. [2010-06-27]. (原始内容于2010-08-26). 
  5. ^ MSDN. [2010-06-27]. (原始内容于2010-06-06). 
  6. ^ 存档副本. [2010-06-27]. (原始内容于2011-07-08). 

参见 编辑

  • UUID
  • Security Identifier英语Security Identifier (SID)
  • Object identifier英语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)
  • 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(页面存档备份,存于互联网档案馆

全局唯一标识符, 英語, globally, unique, identifier, 缩写, guid, 发音为, ˈɡuːɪd, ˈɡwɪd, 是一种由算法生成的唯一标识, 通常表示成32个16进制数字, 组成的字符串, 21ec2020, 3aea, 1069, a2dd, 08002b30309d, 它实质上是一个128位长的二进制整数, guid一词有时也专指微软对uuid标准的实现, guid的主要目的是产生完全唯一的数字, 在理想情况下, 任何计算机和计算机集群都不会生成两个相同的guid, guid的. 全局唯一标识符 英語 Globally Unique Identifier 缩写 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的算法通常都加入了非随机的参数 如时间 以保证这种重复的情况不会发生 见算法章节 目录 1 实例 2 基本结构 3 文本编码 4 算法 5 序列化算法 6 参考资料 7 参见 8 外部链接实例 编辑Windows操作系统使用GUID来标识COM对象中的类和界面 一个脚本可以不需知道DLL的位置和名字直接通过GUID来激活其中的类或对象 英特尔的全局唯一标识分区表使用GUID来标识硬盘和分区 微软的ActiveX使用UUID来标识每一个不同的浏览器控件 基本结构 编辑GUID本质上是一个16字节 128位 的二进制数 最常见 1 的结构如下 位 字节 描述 字节序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 数据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追溯到最初创建这个文件的电脑 这个漏洞曾被用于寻找梅丽莎病毒的制作者的位置 2 在其它几组数字中 大多数是根据生成GUID的时间决定的 我们可以通过GUID中第三组数字的第一位是不是1来判断它是否是第一版的GUID算法生成的 例如 2f1e4fc0 81fd 11da 9156 00036a0f876a 第四版的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 Server 2005版开始 微软在Transact SQL中加入了一个新函数 叫做NEWSEQUENTIALID 5 用来生成主键增大的GUID 但一旦服务器重新启动 其再次生成的GUID可能反而变小 但仍然保持唯一 这在很大程度上提高了索引的性能 但并不能保证所生成的GUID一直增大 这个函数产生的GUID很简单就可以预测 因此不适合用于安全目的 2006年 一些程序员发现 在一些平台上的Oracle软件中 SYS GUID函数能返回序列化的GUID 但这个实际上是一个BUG导致的 6 参考资料 编辑A Universally Unique IDentifier UUID URN Namespace IETF RFC 4122 Globally Unique Identifiers Internal Structure Microsoft 存档副本 2010 06 27 原始内容存档于2010 06 23 Tracking Melissa s alter egos 新闻稿 ZDNet 1999 04 02 2010 06 27 原始内容存档于2012 10 21 Design and Cryptanalysis of UUID generator in Windows 2010 06 27 原始内容存档于2010 05 31 InformIT 2010 06 27 原始内容存档于2010 08 26 MSDN 2010 06 27 原始内容存档于2010 06 06 存档副本 2010 06 27 原始内容存档于2011 07 08 参见 编辑UUID Security Identifier 英语 Security Identifier SID Object identifier 英语 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 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title 全局唯一标识符 amp oldid 74532781, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。