相關文章:
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再重新轉換一次。只要傳入參數相同則任意時刻的輸出也相同。