uuid是谷歌开发的生成16字节UUID的模块,实现了RFC4122;对UUID的v1,v2,v3,v4,v5等各个版本都有实现。使用方法示例如下:
package main
import (
"fmt"
"github.com/google/uuid"
)
func testv1() {
id, err := uuid.NewUUID()
if err != nil {
fmt.Printf("%v\n", err)
return
}
fmt.Printf("%s %s\n", id, id.Version().String())
}
func testv4() {
id := uuid.New()
fmt.Printf("%s %s\n", id, id.Version().String())
}
func testv2G() {
id, err := uuid.NewDCEGroup()
if err != nil {
fmt.Printf("%v\n", err)
return
}
fmt.Printf("%s %s\n", id, id.Version().String())
}
func testv2P() {
id, err := uuid.NewDCEPerson()
if err != nil {
fmt.Printf("%v\n", err)
return
}
fmt.Printf("%s %s\n", id, id.Version().String())
}
func testv3() {
id2, err := uuid.NewDCEPerson()
if err != nil {
fmt.Printf("%v\n", err)
return
}
id := uuid.NewMD5(id2, []byte("fssds32"))
fmt.Printf("%s %s\n", id, id.Version().String())
}
func testv5() {
id2, err := uuid.NewDCEPerson()
if err != nil {
fmt.Printf("%v\n", err)
return
}
id := uuid.NewSHA1(id2, []byte("fssds32"))
fmt.Printf("%s %s\n", id, id.Version().String())
}
func main() {
for i := 0; i < 5; i++ {
testv1()
}
for i := 0; i < 5; i++ {
testv4()
}
for i := 0; i < 5; i++ {
testv2G()
}
for i := 0; i < 5; i++ {
testv2P()
}
for i := 0; i < 5; i++ {
testv3()
}
for i := 0; i < 5; i++ {
testv5()
}
}
输出:
a8d8fe8a-74a8-11ea-925a-7845c40c51db VERSION_1
a8d92335-74a8-11ea-925a-7845c40c51db VERSION_1
a8d92380-74a8-11ea-925a-7845c40c51db VERSION_1
a8d923bb-74a8-11ea-925a-7845c40c51db VERSION_1
a8d923f3-74a8-11ea-925a-7845c40c51db VERSION_1
3090c0bf-aee2-47b5-a7ea-01edb4a09e82 VERSION_4
9d6e8db4-6ee4-454a-8786-752622ec50cc VERSION_4
3754651e-9392-4411-81ed-6af0e0d48d93 VERSION_4
332c2fb7-7169-4196-89e3-0c1273a9c5df VERSION_4
49261bee-c84f-482f-a2a0-a837ae3ae46d VERSION_4
00000000-74a8-21ea-9201-7845c40c51db VERSION_2
00000000-74a8-21ea-9201-7845c40c51db VERSION_2
00000000-74a8-21ea-9201-7845c40c51db VERSION_2
00000000-74a8-21ea-9201-7845c40c51db VERSION_2
00000000-74a8-21ea-9201-7845c40c51db VERSION_2
00000000-74a8-21ea-9200-7845c40c51db VERSION_2
00000000-74a8-21ea-9200-7845c40c51db VERSION_2
00000000-74a8-21ea-9200-7845c40c51db VERSION_2
00000000-74a8-21ea-9200-7845c40c51db VERSION_2
00000000-74a8-21ea-9200-7845c40c51db VERSION_2
32504b02-6173-35c2-9cf1-99ce0ab2bb6b VERSION_3
32504b02-6173-35c2-9cf1-99ce0ab2bb6b VERSION_3
32504b02-6173-35c2-9cf1-99ce0ab2bb6b VERSION_3
32504b02-6173-35c2-9cf1-99ce0ab2bb6b VERSION_3
32504b02-6173-35c2-9cf1-99ce0ab2bb6b VERSION_3
fe21be2d-3565-57f7-99e6-24aa95f30290 VERSION_5
fe21be2d-3565-57f7-99e6-24aa95f30290 VERSION_5
fe21be2d-3565-57f7-99e6-24aa95f30290 VERSION_5
fe21be2d-3565-57f7-99e6-24aa95f30290 VERSION_5
fe21be2d-3565-57f7-99e6-24aa95f30290 VERSION_5
结论:
v1,v4都是每次生成一个唯一的ID,而v1同一时刻的输出非常相似,v1末尾nodeID部分用的都是mac地址,前面time的mid,high以及clock序列都是一样的,只有time-low部分不同。v4加入了随机数,对各个部分都进行了随机处理,同一时刻的输出差别很大。
v2 NewDCEGroup()根据os.Getgid取到的用户组ID来生成uuid,同一时刻的输出是相同的。
v2 NewDCEPerson()根据os.Getuid取到的用户ID来生成uuid,同一时刻的输出也是相同的。
v3 NewMD5(space UUID, data []byte)是根据参数传入的UUID结构体和[]byte再重新转换一次。只要传入参数相同则任意时刻的输出也相同。
v5NewSHA1(space UUID, data []byte)是根据参数传入的UUID结构体和[]byte再重新转换一次。只要传入参数相同则任意时刻的输出也相同。
相关文章: