微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

go-snowflake 算法简介安装运行创建Snowflake对象生成唯一ID通过ID获取数据中心ID与机器ID通过ID获取时间戳创建ID时的时间戳 - epoch通过ID获取生成ID时的时间戳通过ID获取生成ID时的时间精确到:秒查看时间戳字段使用占比41bit能存储的范围:从epoch开始往后69年 分布式 ID 生成算法

程序名称:go-snowflake 算法简介安装运行创建Snowflake对象生成唯一ID通过ID获取数据中心ID与机器ID通过ID获取时间戳创建ID时的时间戳 - epoch通过ID获取生成ID时的时间戳通过ID获取生成ID时的时间精确到:秒查看时间戳字段使用占比41bit能存储的范围:从epoch开始往后69年

授权协议: Apache

操作系统: 跨平台

开发语言: Google Go

go-snowflake 算法简介安装运行创建Snowflake对象生成唯一ID通过ID获取数据中心ID与机器ID通过ID获取时间戳创建ID时的时间戳 - epoch通过ID获取生成ID时的时间戳通过ID获取生成ID时的时间精确到:秒查看时间戳字段使用占比41bit能存储的范围:从epoch开始往后69年 介绍

❄️ GO-SNowflake

SNowflake简介

在单机系统中我们会使用自增id作为数据的唯一id,自增id在数据库中有利于排序和索引,但是在分布式系统中如果还是利用数据库的自增id会引起冲突,自增id非常容易被爬虫爬取数据。在分布式系统中有使用uuid作为数据唯一id的,但是uuid是一串随机字符串,所以它无法被排序。

Twitter设计了SNowflake算法为分布式系统生成ID,SNowflake的id是int64类型,它通过datacenterId和workerId来标识分布式系统,下面看下它的组成:

1bit 41bit 5bit 5bit 12bit
符号位(保留字段) 时间戳(当前时间-纪元时间) 数据中心id 机器id 自增序列

算法简介

在使用SNowflake生成id时,首先会计算时间戳timestamp(当前时间 -
纪元时间),如果timestamp数据超过41bit则异常。同样需要判断datacenterId和workerId不能超过5bit(0-31),在处理自增序列时,如果发现自增序列超过12bit时需要等待,因为当前毫秒下12bit的自增序列被用尽,需要进入下一毫秒后自增序列继续从0开始递增。

快速开始

安装

git clone https://github.com/GUAIK-ORG/go-sNowflake.git

运行

go run main.go

使用说明

创建SNowflake对象

// NewSNowflake(datacenterid, workerid int64) (*SNowflake, error)
// 参数1 (int64): 数据中心ID (可用范围:0-31)
// 参数2 (int64): 机器ID    (可用范围:0-31)
// 返回1 (*SNowflake): SNowflake对象 | nil
// 返回2 (error): 错误码
s, err := sNowflake.NewSNowflake(int64(0), int64(0))
if err != nil {
    glog.Error(err)
    return
}

生成唯一ID

s, err := sNowflake.NewSNowflake(int64(0), int64(0))
// ......
// (s *SNowflake) NextVal() int64
// 返回1 (int64): 唯一ID
id := s.NextVal()
// ......

通过ID获取数据中心ID与机器ID

// ......
// Getdeviceid(sid int64) (datacenterid, workerid int64)
// 参数1 (int64): 唯一ID
// 返回1 (int64): 数据中心ID
// 返回2 (int64): 机器ID
datacenterid, workerid := sNowflake.Getdeviceid(id))

通过ID获取时间戳(创建ID时的时间戳 - epoch)

// ......
// GetTimestamp(sid int64) (timestamp int64)
// 参数1 (int64): 唯一ID
// 返回1 (int64): 从epoch开始计算的时间戳
t := sNowflake.GetTimestamp(id)

通过ID获取生成ID时的时间戳

// ......
// GetGenTimestamp(sid int64) (timestamp int64)
// 参数1 (int64): 唯一ID
// 返回1 (int64): 唯一ID生成时的时间戳
t := sNowflake.GetGenTimestamp(id)

通过ID获取生成ID时的时间(精确到:秒)

// ......
// GetGenTime(sid int64)
// 参数1 (int64): 唯一ID
// 返回1 (string): 唯一ID生成时的时间
tStr := sNowflake.GetGenTime(id)

查看时间戳字段使用占比(41bit能存储的范围:从epoch开始往后69年)

// ......
// GetTimestampStatus() (state float64)
// 返回1 (float64): 时间戳字段使用占比(范围 0.0 - 1.0)
status := sNowflake.GetTimestampStatus()

go-snowflake 算法简介安装运行创建Snowflake对象生成唯一ID通过ID获取数据中心ID与机器ID通过ID获取时间戳创建ID时的时间戳 - epoch通过ID获取生成ID时的时间戳通过ID获取生成ID时的时间精确到:秒查看时间戳字段使用占比41bit能存储的范围:从epoch开始往后69年 官网

https://guaik-org.github.io/go-snowflake/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐