1 Star 0 Fork 1

技术狼/go-fun

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
algorithm_snowflake.go 1.43 KB
一键复制 编辑 原始数据 按行查看 历史
技术狼 提交于 1年前 . no message
/*
【包名:】雪花算法
【作者:】技术狼
*/
package fun
import (
"errors"
"sync"
"time"
)
const (
workerBits uint8 = 10
numberBits uint8 = 12
workerMax int64 = -1 ^ (-1 << workerBits)
numberMax int64 = -1 ^ (-1 << numberBits)
timeShift uint8 = workerBits + numberBits
workerShift uint8 = numberBits
startTime int64 = 1525705533000 // 如果在程序跑了一段时间修改了epoch这个值 可能会导致生成相同的ID
)
type snowflakeWorker struct {
mu sync.Mutex
timestamp int64
workerId int64
number int64
}
// @title: 创建雪花算法节点
// @param: int64
// @return: *snowflakeWorker, error
// @description:
// @date: 2024/6/11 22:32
func Snowflake(workerId int64) (*snowflakeWorker, error) {
if workerId < 0 || workerId > workerMax {
return nil, errors.New("Worker ID 超出数量")
}
// 生成一个新节点
return &snowflakeWorker{
timestamp: 0,
workerId: workerId,
number: 0,
}, nil
}
// @title: 获取雪花ID
// @param:
// @return: int64
// @description:
// @date: 2024/6/11 22:32
func (w *snowflakeWorker) GetId() int64 {
w.mu.Lock()
defer w.mu.Unlock()
now := time.Now().UnixNano() / 1e6
if w.timestamp == now {
w.number++
if w.number > numberMax {
for now <= w.timestamp {
now = time.Now().UnixNano() / 1e6
}
}
} else {
w.number = 0
w.timestamp = now
}
ID := int64((now-startTime)<<timeShift | (w.workerId << workerShift) | (w.number))
return ID
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/jishulangcom/go-fun.git
git@gitee.com:jishulangcom/go-fun.git
jishulangcom
go-fun
go-fun
v0.0.4

搜索帮助