UUID全称Universally Unique IDentifier,由4个连字符-
将一个32字节长(32个十六进制数组成)的字符串分割为5段,共计36字节长128位的字符串。
例如:
550e8400-e29b-41d4-a716-446655440000
UUID的目的是让分布式系统中所有元素都具有唯一的辨识信息,而无需通过中心节点指定,同时无需考虑数据创建时的名称重复问题。目前最广泛使用的UUID是RFC4122协议。
UUID实现中,GUID特指微软对标准UUID的实现。MySQL中可使用UUID()
函数来生成,可使用CHAR(36)
或BINARY(36)
来存储。
> SELECT UUID();
7c8a38b5-6490-11ec-9251-f43909452c6f
为保证UUID的唯一性,RFC4122规范定义了包括网卡MAC地址、时间戳、命名空间、随机、伪随机、时序等元素,以及从这些元素中生成UUID的算法。UUID的复杂特性在保证其唯一性同时,意味着也只能通过计算机来生成。
版本 | 描述 |
---|---|
v1 | 基于时间,通过当前时间戳、机器MAC地址生成,MAC全球唯一但会暴露存在风险。 |
v2 | DCE安全,和v1算法相同,但将时间戳前4位置换为POSIX的UID或GID。 |
v3 | 基于命名空间,由用户指定一个命名空间和一个具体的字符串,通过MD5散列生成。 |
v4 | 基于随机数,根据随机数或伪随机数生成。 |
v5 | 基于名字空间,类似v3不过散列函数换成了SHA1。 |
uuidgen
Linux系统中可使用系统命令/usr/bin/uuidgen
来生成UUID
$ /usr/bin/uuid
Golang可借助于exec.Command
来执行uuidgen
命令来生成
package main
import (
"fmt"
"log"
"os/exec"
)
func main(){
out,err := exec.Command("uuidgen").Output()
if err!=nil {
log.Fatal(err)
}
fmt.Printf("%s\n", out)
}
google/uuid
google/uuid
是Google开发的生成16字节UUID的Golang模块,实现了RFC4122,对UUID的v1、v2、v3、v4等版本都有实现。一般而言要生成唯一序列号的话,通常会使用v4版本。
创建项目并初始化包
$ mkdir test && cd test
$ go mod init test
下载并安装google/uuid
到本地GOPATH
目录下
$ go get -u -v github.com/google/uuid
创建入口文件并测试生成
$ vim main.go
package main
import (
"fmt"
"github.com/google/uuid"
)
func main(){
id := uuid.New()
fmt.Printf("%s %s\n", id, id.Version().String()) // 75381edd-ba50-4ae1-a480-2ef436457601 VERSION_4
fmt.Printf("%s\n", uuid.New().String()) // c4aa07c3-8bcc-4ac1-9562-72e11bbfd7e8
}