go雪花算法

本文介绍了雪花算法,一种生成64位ID的方法,利用时间戳、机器标识和序列号确保ID唯一且有序。文章讨论了其优点如高效生成、无依赖性和基本有序性,同时提到了Sonyflake的差异。还展示了如何在项目中使用Twitter的snowflake库生成ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

雪花算法是为了得到不同的id存在的,世界上没有两片相同的雪花,这也是雪花算法得名由来。

雪花算法的逻辑

雪花算法的得到id先叫雪花id吧,他由64位bit组成

  • 首位保留位不用默认位0(固定)
  • 41位时间戳(当前时间截 – 开始时间截)
  • 10位机器位(不同机器上面不同,故最多部署在2的10次方,1024台机器上面)
  • 12位bit序列号(用来记录同毫秒内产生的不同id,同一机器同一时间可产生4096个号)

雪花算法的到id的优缺点

1.系统环境ID不重复(由时间戳机器号,序列号保证,除非大需求情况,这种情况基本不存在

能满足高并发分布式系统环境ID不重复,比如大家熟知的分布式场景下的数据库表的ID生成。

2.生成效率极高(409.6w/s)

在高并发,以及分布式环境下,除了生成不重复 id,每秒可生成百万个不重复 id,生成效率极高。

3.保证基本有序递增

基于时间戳,可以保证基本有序递增,很多业务场景都有这个需求。

4.不依赖第三方库

不依赖第三方的库,或者中间件,算法简单,在内存中进行。

5.依赖服务器时间,服务器时钟回拨时可能会生成重复 id

sonyflake与雪花算法类似,位数分配不同有差别

项目中简单使用(使用推特写好的库github.com/bwmarrin/snowflake)

package snowflake

import (
	"time"

	sf "github.com/bwmarrin/snowflake"
)

var node *sf.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
	}
	sf.Epoch = st.UnixNano() / 1000000
	node, err = sf.NewNode(machineID)
	return
}

func GenID() int64 {
	return node.Generate().Int64()
}

使用这个包里面的GenID生成id

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值