1 Star 0 Fork 0

朱良才/knife

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
fast_snowflake.go 1.40 KB
一键复制 编辑 原始数据 按行查看 历史
liangcaizhu 提交于 2023-08-12 16:28 +08:00 . 改进版snowflake
package gen
import (
"gitee.com/zhuliangcai/knife/timeutil"
"sync/atomic"
"time"
)
// Snowflake 首位0,workid占有10位,时间戳41位,自增占用12位
// Snowflake 改进简化版雪花算法
type Snowflake struct {
startId int64
wid int64
startTime int64
}
// NewSnowflake http://www.manongjc.com/detail/29-fixpagcswacgpvg.html
// NewSnowflake seata改进型雪花算法分布式ID-java实现
func NewSnowflake(workerId int64) *Snowflake {
workerId &= 1023
wid := workerId
// 机器码左移至高位
workerId <<= MachineBit
st := time.Now().Unix()
// 跟先前保存好的高11位进行一个或的位运算
startId := workerId | (st << TimestampBit)
return &Snowflake{startId, wid, st}
}
// NextId 获取唯一id
func (sf *Snowflake) NextId() int64 {
return atomic.AddInt64(&sf.startId, 1)
}
func (sf *Snowflake) Info() (int64, int64, int64) {
return explain(sf.startId)
}
func explain(id int64) (int64, int64, int64) {
workerId := id >> MachineBit
// 首位是0
timestamp := (id << (WorkerBit + 1)) >> ((WorkerBit + 1) + TimestampBit)
seq := id & 4095
return workerId, timestamp, seq
}
func (sf *Snowflake) InfoString() (int64, string, int64) {
workId, ts, seq := sf.Info()
return workId, timeutil.TimeFormat(ts), seq
}
// MachineBit 机器码移位52
const MachineBit = 53
// WorkerBit 工作位数
const WorkerBit = 10
// TimestampBit 时间戳移位12
const TimestampBit = 12
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/zhuliangcai/knife.git
git@gitee.com:zhuliangcai/knife.git
zhuliangcai
knife
knife
v0.0.9

搜索帮助