Contents

最近看了下面几个文章,讲了GUID的一些相关知识,解释的很清楚,有兴趣的可以看看,我把大概要点翻译整理了一下。
GUID Guide, part one - Fabulous Adventures In Coding - Site Home - MSDN Blogs
GUID guide, part two - Fabulous Adventures In Coding - Site Home - MSDN Blogs
GUID guide, part three - Fabulous Adventures In Coding - Site Home - MSDN Blogs

GUID有如下的形式:
{xxxxxxxx-xxxx-1xxx-xxxx-xxxxxxxxxxxx} or
{xxxxxxxx-xxxx-4xxx-xxxx-xxxxxxxxxxxx}
这个1和4表明了GUID的生成策略。

策略1使用了MAC地址和时间。
这种策略有2个缺点:
1)如果机器没有网卡,那么生成的GUID不保证是唯一的。
2)有可能生成一样的GUID。(比如2个GUID生成器同时尝试生成GUID,或者时间倒流)

使用1策略生成GUID有几个特点:
1)生成的GUID不是随机的,所以不能用来生成随机数。
2)有可能在特定机器上生成的GUID是单调递增的,这对于用这个GUID用来做数据库的primary key,并且数据库用primary key做index来说是个好消息。
3)可以通过GUID找到生成这个GUID的机器,有隐私问题。
4)他的子序列不具备全局唯一的特性。

策略4使用了随机数:
1)第四段的第一个永远是8,9,a或者b,这表明了版本信息,加上第三段的第一个4,一共有6个bit被reserve了,剩下的122个bit可以随机生成。
2)122个bit的完全随机数,概率上7万年后可能有2个随机数一样,对于一个特定的数,3百亿万亿年后有可能生成一个一样的。

总结:
1)GUID保证唯一,但是不保证随机,所以不要用GUID当作随机数来使用。
2)随机数算法生成的GUID不是密码学强度的随机数。
3)只有大家遵守GUID生成规则,GUID才是唯一的,GUID是一个生成规则,而不是一个安全机制。
4)GUID有内部的结构,至少有6个bit的保留字有特殊含义。
5)GUID允许顺序生成。
6)完整的GUID才有唯一性,子串不具备唯一性。
7)GUID可以用多种算法生成出来。
8)用随机方法生成的GUID在可以预见的将来有非常低的概率重复。
9)GUID可以泄漏生成的时间空间信息(比如机器),无论是策略1(直接获得)还是策略4(通过密码分析).
10)GUID在将来可能会用完全不同的算法来生成。

Contents