雪花算法是为了得到不同的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