golang实现twitter雪花算法(代码片段)

blogbobo blogbobo     2022-11-29     434

关键词:

  1 /*
  2  * twitter雪花算法golang实现,生成唯一趋势自增id
  3  * 保留位:63位
  4  * 毫秒时间戳:[62-20]43位,时间范围[1970-01-01 00:00:00.000,2248-09-26 15:10:22.207]
  5  * 机器id:[19-12]8位,十进制范围[0,255]
  6  * 序列号:[11-0]12位,十进制范围[0,4095]
  7  * bobo
  8  */
  9 
 10 package test
 11 
 12 import (
 13     "runtime"
 14     "sync"
 15     "time"
 16 )
 17 
 18 type SnowFlake struct 
 19     machineID int64      //机器 id占8位,十进制范围是[0,255]
 20     sn        int64      //序列号占12位,十进制范围是[0,4095]
 21     lastTime  int64      //上次的时间戳(毫秒级)
 22     _lock     sync.Mutex //
 23 
 24 
 25 var Snow = &SnowFlake
 26     lastTime: time.Now().UnixNano() / 1000000,
 27 
 28 
 29 func (c *SnowFlake) lock() 
 30     c._lock.Lock()
 31 
 32 
 33 func (c *SnowFlake) unLock() 
 34     c._lock.Unlock()
 35 
 36 
 37 //获取当前毫秒
 38 func (c *SnowFlake) getCurMilliSecond() int64 
 39     return time.Now().UnixNano() / 1000000
 40 
 41 
 42 //设置机器id,默认为0,范围[0,255]
 43 func (c *SnowFlake) SetMachineId(mId int64) 
 44     //保留8位
 45     mId = mId & 0xFF
 46     //左移12位,序列号是12位的
 47     mId <<= 12
 48     c.machineID = mId
 49 
 50 
 51 //获取机器id
 52 func (c *SnowFlake) GetMachineId() int64 
 53     mId := c.machineID
 54     mId >>= 12
 55     return mId | 0xFF
 56 
 57 
 58 //解析雪花(id)
 59 // 返回值
 60 // milliSecond:毫秒数
 61 // mId:机器id
 62 // sn:序列号
 63 func (c *SnowFlake) ParseId(id int64) (milliSecond, mId, sn int64) 
 64     sn = id & 0xFFF
 65     id >>= 12
 66     mId = id & 0xFF
 67     id >>= 8
 68     milliSecond = id & 0x7FFFFFFFFFF
 69 
 70     return
 71 
 72 
 73 //毫秒转换成time
 74 func (c *SnowFlake) MilliSecondToTime(milliSecond int64) (t time.Time) 
 75     return time.Unix(milliSecond/1000, milliSecond%1000*1000000)
 76 
 77 
 78 //毫秒转换成"20060102T150405.999Z"
 79 func (c *SnowFlake) MillisecondToTimeTz(ts int64) string 
 80     tm := Snow.MilliSecondToTime(ts)
 81     return tm.UTC().Format("20060102T150405.999Z")
 82 
 83 
 84 //毫秒转换成"2006-01-02 15:04:05.999"
 85 func (c *SnowFlake) MillisecondToTimeDb(ts int64) string 
 86     tm := Snow.MilliSecondToTime(ts)
 87     return tm.UTC().Format("2006-01-02 15:04:05.999")
 88 
 89 
 90 //获取雪花
 91 //返回值
 92 //id:自增id
 93 //ts:生成该id的毫秒时间戳
 94 func (c *SnowFlake) GetSnowflakeId() (id, ts int64) 
 95     curTime := c.getCurMilliSecond()
 96     var sn int64 = 0
 97 
 98     c.lock()
 99     // 同一毫秒
100     if curTime == c.lastTime 
101         c.sn++
102         // 序列号占 12 位,十进制范围是 [0,4095]
103         if c.sn > 4095 
104             for 
105                 // 让出当前线程
106                 runtime.Gosched()
107                 curTime = c.getCurMilliSecond()
108                 if curTime != c.lastTime 
109                     break
110                 
111             
112             c.sn = 0
113         
114      else 
115         c.sn = 0
116     
117     sn = c.sn
118     c.lastTime = curTime
119     c.unLock()
120 
121     //当前时间小于上次的时间,系统时间改过了吗?
122     /*
123         if curTimeStamp < c.lastTimeStamp 
124                 return 0, curTimeStamp
125         
126     */
127     //机器id占用8位空间,序列号占用12位空间,所以左移20位
128     rightBinValue := curTime & 0x7FFFFFFFFFF
129     rightBinValue <<= 20
130     id = rightBinValue | c.machineID | sn
131 
132     return id, curTime
133 

测试

 1 func testFun() 
 2     var count int = 1000000
 3     mapId := make(map[int64]int64, count)
 4     fmt.Println("start,count:", count)
 5     for i := 0; i < count; i++ 
 6         id, ts := test.Snow.GetSnowflakeId()
 7         mapId[id] = ts
 8     
 9     fmt.Println("done,count:", count, ",mapCount:", len(mapId))
10 

 

java实现雪花算法(snowflake)-生成永不重复的id(源代码+工具类)使用案例(代码片段)

雪花算法是由Twitter公司开源的snowflake(雪花)算法。1、雪花算法的原理雪花算法会生成一个64位的二进制数据,为一个Long型。(转换成字符串后长度最多19),其基本结构:第一位:为未使用第二部分:41位为毫秒级时间(41位... 查看详情

java实现雪花算法(snowflake)-生成永不重复的id(源代码+工具类)使用案例(代码片段)

雪花算法是由Twitter公司开源的snowflake(雪花)算法。1、雪花算法的原理雪花算法会生成一个64位的二进制数据,为一个Long型。(转换成字符串后长度最多19),其基本结构:第一位:为未使用第二部分:41位为毫秒级时间(41位... 查看详情

雪花算法(代码片段)

...行运算,因此一般的时间戳、UUID都不是很可靠。为此,Twitter提出了一种名为“雪花算法”的算法来生成分布式全局唯一ID的算法算法介绍“雪花算法”生成的ID为\\(64\\)位整数,其中,前\\(41\\)位(\\(64\\)位整数第一位表示符号位... 查看详情

6-9雪花算法与新增功能(代码片段)

新增工具类:/***Twitter的分布式自增ID雪花算法**/@ComponentpublicclassSnowFlake/***起始的时间戳*/privatefinalstaticlongSTART_STMP=1609459200000L;//2021-01-0100:00:00/***每一部分占用的位数*/privatefinalstaticlongSEQUEN 查看详情

雪花算法如何生成用户id?有什么高明之处?(代码片段)

...分布式ID的特点snowflake算法介绍设计思想snowflake的Go实现Twitter索尼雪花 查看详情

编程实践golang实现雪花算法

1.雪花算法1.1.1.关于雪花雪花(snowflake)在自然界中,是极具独特美丽,又变幻莫测的东西:1.雪花属于六方晶系,它具有四个结晶轴,其中三个辅轴在一个基面上,互相以60度的角度相交,第四轴(主晶轴)与三个辅轴所形成的基面... 查看详情

id生成算法-雪花算法(snowflake)及代码实现(代码片段)

...章目录前言一、ID生成算法对比二、雪花算法原理三、java实现结尾前言唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种:依赖数据库,使用如MySQL自增列或Oracle... 查看详情

分布式id理解snowflake算法的实现原理(代码片段)

...局唯一ID雪花算法snowflake2.前提#Snowflake(雪花)是Twitter开源的高性能ID生成算法(服务)。上图是Snowflake的Github仓库,mas 查看详情

厉害了,美女同事用单例模式实现了雪花算法!(代码片段)

点击关注公众号,Java干货及时送达雪花算法雪花算法适用于生成全局唯一的编号,比如数据库主键id,订单编号等至于为什么叫雪花算法,是因为科学家通过研究认为自然界中不存在两片完全相同的雪花,所... 查看详情

snowflake雪花算法详解与实现(代码片段)

...一时间阅读最新文章。文章目录背景SnowFlake雪花算法算法实现算法验证算法优缺点注意事项背景现在的服务基本是分布式,微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中id的全局... 查看详情

golang这是核心的findem实现,获取有关twitter用户的一些基本信息并将其显示在屏幕上。(代码片段)

查看详情

分布式id生成方案:雪花算法(源自twitter)

参考技术A雪花(snowflake)在自然界中,是极具独特美丽,又变幻莫测的东西:雪花算法的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等。算法描述:snowflake.gomain.go测试结果:结论: 查看详情

snowflake雪花算法分布式实现全局id生成(代码片段)

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。这种方案大致来说是一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来标示机器、时间... 查看详情

golang建立twitter列表功能(代码片段)

查看详情

雪花算法原理和实现

...g.csdn.net/lq18050010830/article/details/89845790SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long型的数字作为全局唯一id。在分布式系统中的 查看详情

雪花算法原理和实现

...g.csdn.net/lq18050010830/article/details/89845790SnowFlake算法,是Twitter开源的分布式id生成算法。其核心思想就是:使用一个64bit的long型的数字作为全局唯一id。在分布式系统中的 查看详情

id生成器雪花算法和雪花算法的sony实现(代码片段)

...长的bit来表示,这个需要考虑业务量了。理论上我们可以实现无线长度的数据,因为只要使用字符串就行。 2雪花算法的sony实现2.1功能描述39位时间戳,8位序列id,16位机器id   2.2详细描述作者自己的描述//39bitsforti... 查看详情

雪花算法中机器id保证全局唯一(代码片段)

...af——美团点评分布式ID生成系统通常在生产中会用Twitter开源的雪花算法来生成分布式主键雪花算法中的核心就是机器id和数据中心id,通常来说数据中心id可以在配置文件中配置,通常一个服务集群可以共用一个配置文件,而... 查看详情