UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。Golang如何生成UUID字符串呢?可以使用github开源的go.uuid来生成。

参考以下代码:

1
2
3
4
5
6
7
8
9
package uuid_utils

import uuid "github.com/satori/go.uuid"

func GenUUIDString() string {
   u := uuid.Must(uuid.NewV4())
   uId := u.String()
   return uId
}

以上V4表示使用UUID的V4版本,V4 是使用最为广泛的。

UUID的5个版本:

UUID的5个版本,是根据不同的使用场景划分的,而不是根据精度,所以Version5并不会比Version1精度高,在精度上,大家都能保证唯一性,重复的概率近乎于0。

UUID的5个版本英文说明:

  • Version 1, based on timestamp and MAC address (RFC-4122)

  • Version 2, based on timestamp, MAC address and POSIX UID/GID (DCE 1.1)

  • Version 3, based on MD5 hashing of a named value (RFC-4122)

  • Version 4, based on random numbers (RFC-4122)

  • Version 5, based on SHA-1 hashing of a named value (RFC-4122)

我们应该使用UUID哪个版本:

如果只是需要生成一个唯一ID,你可以使用V1或V4。

  • V1基于时间戳和Mac地址,这些ID有一定的规律(你给出一个,是有可能被猜出来下一个是多少的),而且会暴露你的Mac地址。

  • V4是完全随机(伪)的。

如果对于相同的参数需要输出相同的UUID,你可以使用V3或V5。

  • V3基于MD5 hash算法,如果需要考虑与其它系统的兼容性的话,就用它,因为它出来得早,大概率大家都是用它的。

  • V5基于SHA-1 hash算法,这个是首选。

UUID的组成格式

UUID有36个字符组成(32个字母数字+4个连接符"-"),格式为:8-4-4-4-12。

UUID使用16进制表示,详细的格式如: xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx。其中M 表示 UUID版本,目前只有五个版本,即只会出现1,2,3,4,5(即UUID的版本号);数字 N 的一至三个最高有效位表示 UUID 变体,目前只会出现 8,9,a,b 四种情况。

例如:5b572392-a8cf-4345-a440-4a5848f3e07d

为什么说UUID是一个128位数字的唯一标识呢?

上文说到UUID是36个字符组成,按一位8bit算,合计位数是(8+4+4+4+12)*8=256位。那为什么说UUID是一个128位数字的唯一标识呢?因为每个字符字母是用的16进制表示,一个16进制只代表4个bit,所以应该是(8+4+4+4+12)*4=128位。