常规网站建设价格实惠,百度一下就知道了官网楯,做正规小说网站,梧州论坛 掌上红豆雪花算法概述
snowflake 是 twitter 开源的分布式ID生成算法#xff0c;其核心思想为#xff0c;一个long型的ID#xff1a;
41 bit 作为毫秒数 - 41位的长度可以使用69年10 bit 作为机器编号 #xff08;5个bit是数据中心#xff0c;5个bit的机器ID#xff09; - 10位…雪花算法概述
snowflake 是 twitter 开源的分布式ID生成算法其核心思想为一个long型的ID
41 bit 作为毫秒数 - 41位的长度可以使用69年10 bit 作为机器编号 5个bit是数据中心5个bit的机器ID - 10位的长度最多支持部署1024个节点12 bit 作为毫秒内序列号 - 12位的计数顺序号支持每个节点每毫秒产生4096个ID序号 代码实现
package mainimport (fmtsynctime
)// 服务上线时间毫秒时间戳
const startTime 1698734492000// SnowflakeId组成timestamps[41bits] workId[10bits] seqId[12bits]
type snowflakeIdWorker struct {sync.MutexworkId int //[0,1024)lastTms int64seqInTms int //[0,4096)
}func NewSnowflakeIdWorker(workId int) *snowflakeIdWorker {return snowflakeIdWorker{Mutex: sync.Mutex{},workId: workId,lastTms: 0,seqInTms: 0,}
}func (p *snowflakeIdWorker) GetUUID() int64 {p.Lock()defer p.Unlock()nowTms : time.Now().UnixNano() / 1e6if nowTms p.lastTms {p.seqInTms (p.seqInTms 1) (112 - 1)if p.seqInTms 0 {for nowTms p.lastTms {nowTms time.Now().UnixNano() / 1e6}}} else {p.seqInTms 4090p.lastTms nowTms}return (nowTms - startTime)22 | int64(p.workId)12 | int64(p.seqInTms)
}func main() {worker : NewSnowflakeIdWorker(1)for i : 0; i 10000; i {a : worker.GetUUID()b : fmt.Sprintf(%b, a)fmt.Println(a, a, b, b, len(b):, len(b))}
}