Go語言:谷歌google的uuid模塊對uuid各個版本的實現(version 1,version 2,version 3,verison 4,version 5)

相關文章:

《Go語言:谷歌google的uuid模塊的基本用法》

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章