前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang 库 - uuid

Golang 库 - uuid

作者头像
twowinter
发布2020-04-17 17:38:14
13.9K0
发布2020-04-17 17:38:14
举报
文章被收录于专栏:twowintertwowinter

0 uuid 基础

UUID(Universally Unique IDentifier)是一个128位数字的唯一标识。

格式

UUID使用16进制表示,共有36个字符(32个字母数字+4个连接符"-"),格式为8-4-4-4-12,如:

6d25a684-9558-11e9-aa94-efccd7a0659b xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx M中使用4位来表示UUID的版本,N中使用1-3位表示不同的variant。如上面所示:M =1, N = a表示此UUID为version-1,variant-1的UUID(Time-based ECE/RFC 4122 UUID)。

但是为什么最开始说它是一个128位的唯一标识呢?这里明明字母位数是(8+4+4+4+12)*8=256位。

因为上面的字母是用的16进制,一个16进制只代表4个bit,所以应该是(8+4+4+4+12)*4=128位。

5种版本

UUID现有5种版本,是根据不同的使用场景划分的,而不是根据精度,所以Version5并不会比Version1精度高,在精度上,大家都能保证唯一性,重复的概率近乎于0。

  • Version 1, based on timestamp and MAC address (RFC-4122)
  • Version 2, based on timestamp, MAC address and POSIX UID/GID (DCE 1.1)
  • Version 3, based on MD5 hashing of a named value (RFC-4122)
  • Version 4, based on random numbers (RFC-4122)
  • Version 5, based on SHA-1 hashing of a named value (RFC-4122)

如何使用5种版本

V4 是使用最为广泛的。

如果只是需要生成一个唯一ID,你可以使用V1或V4。

  • V1基于时间戳和Mac地址,这些ID有一定的规律(你给出一个,是有可能被猜出来下一个是多少的),而且会暴露你的Mac地址。
  • V4是完全随机(伪)的。

如果对于相同的参数需要输出相同的UUID,你可以使用V3或V5。

  • V3基于MD5 hash算法,如果需要考虑与其它系统的兼容性的话,就用它,因为它出来得早,大概率大家都是用它的。
  • V5基于SHA-1 hash算法,这个是首选。

1 库的介绍

Package uuid provides a pure Go implementation of Universally Unique Identifiers (UUID) variant as defined in RFC-4122. This package supports both the creation and parsing of UUIDs in different formats.

UUID 有 5 种版本,这个库都能完美支持。

库的地址:github.com/gofrs/uuid

直接安装做个测试。

go get github.com/gofrs/uuid

2 官方示例

代码语言:javascript
复制
package main

import (
	"log"

	"github.com/gofrs/uuid"
)

// Create a Version 4 UUID, panicking on error.
// Use this form to initialize package-level variables.
var u1 = uuid.Must(uuid.NewV4())

func main() {
	// Create a Version 4 UUID.
	u2, err := uuid.NewV4()
	if err != nil {
		log.Fatalf("failed to generate UUID: %v", err)
	}
	log.Printf("generated Version 4 UUID %v", u2)

	// Parse a UUID from a string.
	s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
	u3, err := uuid.FromString(s)
	if err != nil {
		log.Fatalf("failed to parse UUID %q: %v", s, err)
	}
	log.Printf("successfully parsed UUID %v", u3)
}

测试结果

2020/02/23 12:12:46 generated Version 4 UUID 34b0e422-c7be-404a-8861-a543af8393c8 2020/02/23 12:12:46 successfully parsed UUID 6ba7b810-9dad-11d1-80b4-00c04fd430c8

函数分析

生成 uuid
代码语言:javascript
复制
// NewV4 returns a randomly generated UUID.
func NewV4() (UUID, error) {
	return DefaultGenerator.NewV4()
}

Generator 提供了5种版本的uuid生成方式。

代码语言:javascript
复制
// Generator provides an interface for generating UUIDs.
type Generator interface {
	NewV1() (UUID, error)
	NewV2(domain byte) (UUID, error)
	NewV3(ns UUID, name string) UUID
	NewV4() (UUID, error)
	NewV5(ns UUID, name string) UUID
}
生成 uuid 的封装

Must 是对生成函数的封装,新增了 error 处理。

代码语言:javascript
复制
// Must is a helper that wraps a call to a function returning (UUID, error)
// and panics if the error is non-nil. It is intended for use in variable
// initializations such as
//  var packageUUID = uuid.Must(uuid.FromString("123e4567-e89b-12d3-a456-426655440000"))
func Must(u UUID, err error) UUID {
	if err != nil {
		panic(err)
	}
	return u
}
解析 uuid
代码语言:javascript
复制
// FromString returns a UUID parsed from the input string.
// Input is expected in a form accepted by UnmarshalText.
func FromString(input string) (UUID, error) {
	u := UUID{}
	err := u.UnmarshalText([]byte(input))
	return u, err
}

3 小结

uuid 包支持5种uuid的生成及解析,最广泛使用的就是生成一个V4版本的 uuid: u1 = uuid.Must(uuid.NewV4())

END

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0 uuid 基础
  • 格式
  • 5种版本
  • 如何使用5种版本
  • 1 库的介绍
  • 2 官方示例
    • 测试结果
      • 函数分析
        • 生成 uuid
        • 生成 uuid 的封装
        • 解析 uuid
    • 3 小结
    • END
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档