雪花算法golang实现

雨点打透心脏的1/2处 2022-06-08 04:15 313阅读 0赞

package main

  1. // twitter 雪花算法
  2. // 把时间戳,工作机器ID, 序列号组合成一个 64位 int
  3. // 第一位置零, [2,42]这41位存放时间戳,[43,52]这10位存放机器id,[53,64]最后12位存放序列号
  4. import (
  5. "time"
  6. "fmt"
  7. )
  8. var (
  9. machineID int64 // 机器 id 占10位, 十进制范围是 [ 0, 1023 ]
  10. sn int64 // 序列号占 12 位,十进制范围是 [ 0, 4095 ]
  11. lastTimeStamp int64 // 上次的时间戳(毫秒级), 1秒=1000毫秒, 1毫秒=1000微秒,1微秒=1000纳秒
  12. )
  13. func init() {
  14. lastTimeStamp = time.Now().UnixNano() / 1000000
  15. }
  16. func SetMachineId(mid int64) {
  17. // 把机器 id 左移 12 位,让出 12 位空间给序列号使用
  18. machineID = mid << 12
  19. }
  20. func GetSnowflakeId() int64 {
  21. curTimeStamp := time.Now().UnixNano() / 1000000
  22. // 同一毫秒
  23. if curTimeStamp == lastTimeStamp {
  24. sn++
  25. // 序列号占 12 位,十进制范围是 [ 0, 4095 ]
  26. if sn > 4095 {
  27. time.Sleep(time.Millisecond)
  28. curTimeStamp = time.Now().UnixNano() / 1000000
  29. lastTimeStamp = curTimeStamp
  30. sn = 0
  31. }
  32. // 取 64 位的二进制数 0000000000 0000000000 0000000000 0001111111111 1111111111 1111111111 1 ( 这里共 41 个 1 )和时间戳进行并操作
  33. // 并结果( 右数 )第 42 位必然是 0, 低 41 位也就是时间戳的低 41 位
  34. rightBinValue := curTimeStamp & 0x1FFFFFFFFFF
  35. // 机器 id 占用10位空间,序列号占用12位空间,所以左移 22 位; 经过上面的并操作,左移后的第 1 位,必然是 0
  36. rightBinValue <<= 22
  37. id := rightBinValue | machineID | sn
  38. return id
  39. }
  40. if curTimeStamp > lastTimeStamp {
  41. sn = 0
  42. lastTimeStamp = curTimeStamp
  43. // 取 64 位的二进制数 0000000000 0000000000 0000000000 0001111111111 1111111111 1111111111 1 ( 这里共 41 个 1 )和时间戳进行并操作
  44. // 并结果( 右数 )第 42 位必然是 0, 低 41 位也就是时间戳的低 41 位
  45. rightBinValue := curTimeStamp & 0x1FFFFFFFFFF
  46. // 机器 id 占用10位空间,序列号占用12位空间,所以左移 22 位; 经过上面的并操作,左移后的第 1 位,必然是 0
  47. rightBinValue <<= 22
  48. id := rightBinValue | machineID | sn
  49. return id
  50. }
  51. if curTimeStamp < lastTimeStamp {
  52. return 0
  53. }
  54. return 0
  55. }
  56. func main() {
  57. id:=GetSnowflakeId()
  58. fmt.Println(id)
  59. }

发表评论

表情:
评论列表 (有 0 条评论,313人围观)

还没有评论,来说两句吧...

相关阅读

    相关 雪花算法

    雪花算法生成的ID可用于做分布式系统ID 生成的ID格式 1位标识符(始终是0)+41位时间戳 + 10位机器标识符(5位datacenterId+5位WorkId) +12

    相关 雪花算法

    我们都知道在一个分布式系统中生成一个无重复的标识是非常重要的,业界也有很多算法。 雪花(snowflake)在自然界中,是极具独特美丽,又变幻莫测的东西: 1. 雪花属于

    相关 雪花算法

    雪花算法 `雪花算法`的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等。 结构: ![在这里插入图片描述][watermark_type