Go 语言 UUID 库 google/uuid 源码解析:时钟信息

google/uuid 库地址

google/uuid 时间相关的部分汇聚在 uuid 包下的 time.go 文件中。

UUID 的 RFC 4122 变体中的版本1和版本2依赖于时钟信息,所以 uuid 库将时钟信息的实现定义在本文件中,供对应版本 UUID 的生成使用。

UUID 依赖于时钟信息的实现版本包含两方面的时钟信息:时间和时钟序列。下面将针对时间和时钟序列进行详细介绍。

时间

UUID版本1和版本2的规范,根据RFC 4122,使用的是自1582年10月15日以来的100纳秒数作为时间戳。

这部分信息被存储在 int64 类型中,其声明如下:

type Time int64

而时间戳的生成可以拆分为两部分,go 原生支持的 time.Now().UnixNano 和 Unix 纪元与格里历改日的差。

go 原生支持的 time.Now().UnixNano() 可以获取到距离 Unix 纪年(1970年1月1日00:00:00 UTC)的纳秒数,而我们需要的是距离格里历改日(1582年10月15日)的100纳秒数,所以除了对 time.Now().UnixNano() 除以 100 外还需要补充 Unix 纪元到格里历改日的差。

其实现如下:

const (
	lillian    = 2299160          // 1582年10月15日的儒略日
	unix       = 2440587          // 1970年1月1日的儒略日
	epoch      = unix - lillian   // 两个纪元之间的天数
	g1582      = epoch * 86400    // 两个纪元之间的秒数
	g1582ns100 = g1582 * 10000000 // 两个纪元之间的100纳秒数
)

其先定义Unix 纪元和格里历改日的儒略日常量,然后将其做差得到两个纪元之间的天数,乘以每天的总秒数 86400,最后乘以 10^7 得到两个纪元之间的100纳秒数。

所以最后时间戳的实现如下:

now := uint64(t.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值