1

什么是UUID?

  UUID(Universally Unique Identifier, 通用唯一识别码,也叫GUID(Globally Unique IDentifier,全局唯一识别码)。在互联网工程任务组发布的RFC4122文档中介绍,UUID是一种不需要中央机构分配而产生唯一标识符的方式在时间和空间上保持其唯一性。UUID是由128位的二进制数据组成,通常使用32位的十六进制数据表示,并使用连字符连接。其表示格式为8-4-4-4-12。例如:

7e6eeeef-5271-545e-bcd5-eacf6a804e2b
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx

  M中使用4位来表示UUID的版本,N中使用1-3位表示不同的变体。

  理论上来将,32位的十六进制数据能够产生1632个不同的字符串序列,即使没纳秒生成1兆个uuid序列,也需要100亿年才能用完。

uuid如何保证其唯一性

  RFC 4122 指定了三种算法。
  1.使用MAC值。
  2.使用伪随机数生成器。
  3.使用加密HASH和应用程序提供的文本字符串。

  我们先看一下标准给出的五个版本的uuid生成方式,然后来说明其唯一性。
  版本1:使用时间戳及MAC值,首先MAC地址是厂商分配的,烧制在网卡上的唯一地址,是不可能重复的,其次,即使超出了系统时间精度,比如在1毫秒内生成了两个uuid,为了保证唯一性,也会根据生成顺序,在后边生成的uuid上加1.
  版本3:根据用户提供的名称和名称空间,使用MD5作为HASH函数。
  版本4:完全的随机数。这个牵扯到概率学的问题了,理论上这种方式生成2.71万亿个UUID产生重复的概率只有50%。
  版本5:  和版本3是一样的,但是是使用SHA-1作为HASH函数。
  为什么不说版本二呢?那是因为RFC 4122并没有提供实现细节。。。我也没看懂。

  总之,一般的生成uuid的轮子也都只会提供者四种生成方式。综上所述,uuid重复的可能性无限接近与0。当然,虽然标准中说在时间和空间上都保持uuid的唯一性,然而空间上确实唯一性要低很多。

那么为什么需要uuid呢?

  在业务层面上来讲,无论是为了生产数据库表中唯一的键还是作为接口标识符,uuid的优势就是不需要一个中心化的分配方式。而且它能够生成的唯一值足够多。

如何生成UUID?

  在Javascrip中使用时,可以通过npm查找到一个uid的包,这个包中有对应的上面所说的四个版本的生成方式。具体源码解析容我有空补上。

参考文档:

【1】维基百科  通用唯一识别码

【2】某文 UUID如何保证其唯一性

【3】RFC 4122  UUID


残月古笙
0 声望0 粉丝

一个勇于前进的程序员