Go语言:谷歌google的uuid模块对uuid各个版本的实现(version 1,version 2,version 3,verison 4,version 5)

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再重新转换一次。只要传入参数相同则任意时刻的输出也相同。

相关文章:

《Go语言:谷歌google的uuid模块的基本用法》

扫描二维码关注公众号,回复: 10435030 查看本文章
发布了51 篇原创文章 · 获赞 3 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/pengpengzhou/article/details/105269410