博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全局唯一标识符(GUID)
阅读量:5837 次
发布时间:2019-06-18

本文共 1916 字,大约阅读时间需要 6 分钟。

全局唯一标识符,简称GUID(发音为/ˈɡuːɪd/或/ˈɡwɪd/),是一种由生成的唯一标识,通常表示成32个数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数。GUID一词有时也专指对标准的实现。

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

目录

实例

  • 操作系统使用GUID来标识对象中的类和界面。一个脚本可以不需知道的位置和名字直接通过GUID来激活其中的类或对象。
  • 的使用GUID来标识硬盘和。
  • 微软的使用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通常会写成数的字符串,如:

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编码的GUID有22-24个字符,如:

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

编码后是20个字符,如:

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

在中,GUID第一版的名字空间标识是"uuid",如:

算法

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

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

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

序列化算法

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

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

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

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

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

转载地址:http://wzjcx.baihongyu.com/

你可能感兴趣的文章
【092】罗马数字 XXII.XI.MMXII
查看>>
低配置也玩儿 OSSIM
查看>>
ASP.NET AJAX入门系列(4):使用UpdatePanel控件(一)
查看>>
win7 64位无法安装网络打印机
查看>>
从一个表中查询数据 插入到另外一个表
查看>>
Hibernate中使用memcached
查看>>
VC程序只运行一次实例
查看>>
微内核的消息机制模型(同步消息模型)
查看>>
XNA游戏:Hello XNA
查看>>
中国反钓鱼网站联盟:CN域名下网站安全性能提升
查看>>
Sharepoint学习笔记---Linq to Sharepoint--查询语法
查看>>
格式化文本支持:JTextPane
查看>>
GNU make笔记
查看>>
算法导论之并查集
查看>>
Select语句中的注意事项
查看>>
Binding Events to Methods in the Silverlight MVVM View Models
查看>>
jQuery第三课:修改元素属性及内容
查看>>
如何使SOLR系统自动AUTO COMMIT
查看>>
【JAVASCRIPT】递归与循环的效率比较
查看>>
为silverlight页面创建根页面BasePage
查看>>