日期:2014-05-17  浏览次数:21481 次

浅谈GUID会不会重复
GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,

其中每个 x 是 0-9 或 A-F 范围内的一个32位十六进制数。

以上是GUID的定义

那么

00000000-0000-0000-0000-000000000000
一直到
FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF
也就是(0-9:A-F)的(8+4+4+4+12)次幂

怎么可能不重复呢??



------解决方案--------------------
有限的位数,就有可能会重复。
------解决方案--------------------
引用:
GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,

其中每个 x 是 0-9 或 A-F 范围内的一个32位十六进制数。

以上是GUID的定义

那么

00000000-0000-0000-0000-000000000000
一直到
FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFF……



引用:
只能说重复的可能性无限接近于零罢了...

是的。
GUID 是一个 128 位整数(16 字节),可用于所有需要唯一标识符的计算机和网络。此标识符重复的可能性非常小。
------解决方案--------------------
任何定长的数据,都只能表示有限的组合,所以肯定会重复。但是这只是理论上的事情,guid设计之初就被用来表示唯一的,不重复的id。
------解决方案--------------------
GUID的主要目的是产生完全唯一的数字。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数也足够大,达到了2^128(3.4×10^38)个,所以随机生成两个相同GUID的可能性是非常小的,但并不为0。所以,用于生成GUID的算法通常都加入了非随机的参数(如时间),以保证这种重复的情况不会发生。
----以上是维基百科的内容。

我的理解就是Guid的总数非常大,以目前速度的计算机,产生的两个Guid(产生在2个时刻或2个不同地方)基本上不会重复。假定在计算机上,平均1ns能产生一个,那么不断产生1年,共产生365*24*3600*1000*1000*1000=3.1536*10^16。假定全球有100亿台计算机参与产生,那么共产生3.1536*10^26个Guid。连续产生100年,也只有产生3.1536*10^28个Guid。
所以以目前计算机的性能和总数,理论上能保证不重复。不过极限化一下,假定有一种计算机性能极其优越,1s就能产生2^128(3.4×10^38)个,那么它也仅能保证第1s产生的不重复,第2s产生的必然跟前1s的重复。