雪花算法
雪花算法是twitter开源的由64位整数组成的分布式id,性能高,并且在单机上递增。
1.第一位占用1bit,其值始终是0,没有实际作用。
2.时间戳占用41bit,单位为毫秒,总共可以容纳约69年的时间。当然,我们的时间毫秒计数不会真的从1970年开始记,那样我们的系统跑到2039/9/7 23:47:35 就不能用了,所以这里的时间戳只是相对于某个时间的增量,比如我们的系统上线是2023-03-17,那么我们完全可以把这个timestamp当作是从2023-03-17 00:00:00. 000的偏移量。
3.工作机器id占用10bit,其中高位5bit是数据中心id,低位5bit是工作节点id,最多可以容纳1024个节点。
4.序列号占用12bit,用来记录同毫秒内产生的不同id。每个节点每毫秒0开始不断累加,最多可以累加到4095,同一毫秒-共可以产生4096个id。snowflake算法在同一毫秒内做多可以产生多少全局唯一id呢?同一毫秒的id数量 = 1024 x 4096 = 4194304
go实现代码
1.github.com/bwmarrin/snowflake
package main import ( "fmt" "github.com/bwmarrin/snowflake" "time" ) var node *snowflake.node //初始化一个node func init(starttime string, machineid int64) (err error) { //自定义开始时间 var st time.time st, err = time.parse("2006-01-02", starttime) if err != nil { return } snowflake.epoch = st.unixnano() / 1000000 node, err = snowflake.newnode(machineid) return } func genid() int64 { return node.generate().int64() } func main() { if err := init("2023-03-17", 1); err != nil { fmt.printf("init failed, err:%v\n", err) return } id := genid() fmt.println(id) } var ( sonyflake *sonyflake.sonyflake // 实例 sonymachineid uint16 //机器id ) func getmachineid() (uint16, error) { //返回全局定义的机器id return sonymachineid, nil }
2.github.com/sony/sonyflake
package main import ( "fmt" "github.com/sony/sonyflake" "time" ) var ( sonyflake *sonyflake.sonyflake // 实例 sonymachineid uint16 //机器id ) func getmachineid() (uint16, error) { //返回全局定义的机器id return sonymachineid, nil } //需传入当前的机器id func init(machineid uint16) (err error) { sonymachineid = machineid t, _ := time.parse(" 2006-01-02", "2023-03-17") //初始化一个开始的时间 settings := sonyflake.settings{ // 生成全局配置 starttime: t, machineid: getmachineid, //指定机器id } sonyflake = sonyflake.newsonyflake(settings) // 用配置生成sonyflake节点 return } // getid返回生成的id值 func getid() (id uint64, err error) { //拿到sonyflake节 点生成id值 if sonyflake == nil { err = fmt.errorf("snoy flake not inited") return } id, err = sonyflake.nextid() return }
到此这篇关于go基于雪花算法生成随机id的文章就介绍到这了,更多相关go 生成随机id内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论