全局唯一标识符(GUID)
全局唯一标识符,简称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",如:
算法
在开放软件基金会为计算(第一版)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].
全局唯一标识符(GUID)的更多相关文章
- C# 全局唯一标识符 (GUID)
一 C# 全局唯一标识符 (GUID) Represents a globally unique identifier (GUID). To browse the .NET Framework so ...
- GUID全局唯一标识符
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中. ...
- GUID全局唯一标识符相关知识了解
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情 ...
- [ActionScript 3.0] AS3 GUID(全局唯一标识符)
package com.controls { import flash.display.Sprite; import flash.system.Capabilities; public class G ...
- GUID (全局唯一标识符)
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中. ...
- Identifier:GUID (全局唯一标识符)
ylbtech-Miscellaneos-Identifier:GUID (全局唯一标识符) A,返回顶部 1, 全局唯一标识符(GUID,Globally Unique Identifier)是一种 ...
- 全局唯一标识符(GUID,Globally Unique Identifier)
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中.在理想情况 ...
- GUID(Globally Unique Identifier)全局唯一标识符
最近有大量数据存入数据库时,因为主键为一个nvarchar类型,起初想着用int 类型,每次打开表的时候,获取最后一行的ID,然后让其++. 但发现由于字段是char类型,数据库对其进行了排序.再次插 ...
- JS生成全局唯一标识符(GUID,UUID)的方法
全局唯一标识符(GUID,Globally Unique Identifier)也称作 UUID(Universally Unique IDentifier) . GUID是一种由算法生成的二进制长度 ...
随机推荐
- 如何显示隐藏的Administrator账户
在Windows XP中,Administrator帐户是终极管理员,如果你创建了其他管理员帐户,那么该帐户就会从欢迎屏幕上被隐藏.这里需要注意的是,仅仅是从欢迎屏幕上被隐藏,该帐户仍然存在. 如 ...
- 2016"百度之星"-资格赛
//本题要求:(Ar*A2...An)%p,亦即[(A1*A2*...An)/(A1*A2*...Ar-1)]%p,由于A1*A2...An乘积过大,无法求得相除所得的结果 //我们需要用到乘法逆元( ...
- NGUI Sprite Type(Simple、Sliced、Tiled、Filed、Advanced)
官方文档:http://www.tasharen.com/forum/index.php?topic=6704.0 Sprite Type 下面是UISprite的Type截图,每一种Type都有不同 ...
- sqlzoo.net刷题5
List the continents that have a total population of at least 100 million. 这题考察的是使用集聚函数生成表之后,如何过滤 一般我 ...
- 异常:NSException和NSAssert的简单使用
//断言 - (void)NSAssert_Test:(NSString *)string{ NSAssert(string == nil, @"string == kong or nil& ...
- Xcode7 真机调试步骤以及遇到的问题解决办法
打开Xcode7,打开preference 添加自己的apple ID登陆上去 打开一个自己的想要运行在真机上的项目 插上自己的iPhone真机(真机没必要是最新的系统,没必要升级,我刚开始报错以为是 ...
- VisualStudio2013+EF6+MySql5.5环境下配置
看院子里对EF框架和MySql的配置文章不少,但是几乎出自一篇文章的转载,而且这篇转载的文章的也比较坑爹,下面我将介绍一下我的配置过程: 第一步:安装mysql-connector-net-6.9.9 ...
- 挖Linux中的古老缩略语
[2005-06-22 15:23][Nigel McFarlane][TechTarget] <<阅读原文>> Unix已经有35年历史了.许多人认为它开始于中世纪,这个中世 ...
- 【每日学习】Apache重写未开启,导致The requested URL /xxxx.html was not found on this server
今天把项目环境从集成换成独立的,全部搭建好后,网站主页www.xxx.com能打开,但一涉及到跳转,带参数,比如 www.xxx.com/xxx/xxx.html 就会报错 The requested ...
- 在64位windows下使用instsrv.exe和srvany.exe创建windows服务
在64位windows下使用instsrv.exe和srvany.exe创建windows服务 在32位的windows下,包括windows7,windows xp以及windows 2003, ...