Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了twitter 雪花算法 golang 实现大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
package sNowflake


// twitter 雪花算法
// 把时间戳,工作机器ID,序列号组合成一个 64位 int
// 第一位置零,[2,42]这41位存放时间戳,[43,52]这10位存放机器id,[53,64]最后12位存放序列号


import "time"


var (
machineID int64 // 机器 id 占10位,十进制范围是 [ 0,1023 ]
sn int64 // 序列号占 12 位,4095 ]
lastTimeStamp int64 // 上次的时间戳(毫秒级),1秒=1000毫秒,1毫秒=1000微秒,1微秒=1000纳秒
)


func init() {
lastTimeStamp = time.Now().UnixNano() / 1000000
}


func SetMachineId(mid int64) {
// 把机器 id 左移 12 位,让出 12 位空间给序列号使用
machineID = mid << 12
}


func GetSNowflakeId() int64 {
curTimeStamp := time.Now().UnixNano() / 1000000


// 同一毫秒

if curTimeStamp == lastTimeStamp {
sn++
// 序列号占 12 位,4095 ]
if sn > 4095 {
time.Sleep(time.Millisecond)
curTimeStamp = time.Now().UnixNano() / 1000000
lastTimeStamp = curTimeStamp
sn = 0
}


// 取 64 位的二进制数 0000000000 0000000000 0000000000 0001111111111 1111111111 1111111111 1 ( 这里共 41 个 1 )和时间戳进行并操作

// 并结果( 右数 )第 42 位必然是 0,低 41 位也就是时间戳的低 41 位

rightBinValue := curTimeStamp & 0x1FFFFFFFFFF

// 机器 id 占用10位空间,序列号占用12位空间,所以左移 22 位; 经过上面的并操作,左移后的第 1 位,必然是 0

rightBinValue <<= 22

id := rightBinValue | machineID | sn

return id
}


if curTimeStamp > lastTimeStamp {
sn = 0

lastTimeStamp = curTimeStamp

// 取 64 位的二进制数 0000000000 0000000000 0000000000 0001111111111 1111111111 1111111111 1 ( 这里共 41 个 1 )和时间戳进行并操作

// 并结果( 右数 )第 42 位必然是 0,必然是 0

rightBinValue<<= 22

id :=rightBinValue| machineID | sn

return id

}


if curTimeStamp < lastTimeStamp {
return 0
}

return 0

}



参考

http://blog.csdn.net/liwenbo_csu/article/details/51313555

大佬总结

以上是大佬教程为你收集整理的twitter 雪花算法 golang 实现全部内容,希望文章能够帮你解决twitter 雪花算法 golang 实现所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:算法