记一次 golang 实现Twitter snowFlake算法 高效生成全局唯一ID
holdno · 2018-05-08 01:34:36 · 430 次点击 · 预计阅读时间 5 分钟 · 34分钟之前 开始浏览
这是一个创建于 2018-05-08 01:34:36 的文章,其中的信息可能已经有所发展或是发生改变。
最近在着手准备一个H5游戏
因为这是我第一次接触游戏这个类目
即使量不大也想好好的做它一番
在设计表结构的时候想到了表全局唯一id这个问题
既然是游戏
那么一定是多人在线点点点(运营理想状态 哈哈哈)
一开始想使用mongoDB的objectId来作为全局唯一id
但是字符串作为索引的效率肯定不如整型来得实在
两者的主要差别就在于,字符类型有字符集的概念,每次从存储端到展现端之间都有一个字符集编码的过程。而这一过程主要消耗的就是CPU资源,对于In-memory的操作来说,这是一个不可忽视的消耗。如果使用整型替换可以减少CPU运算及内存和IO的开销。
所以最后考虑到理想状态下的效率及视觉效果(整型),考虑找一个纯整型的id替代方案
无意间看到了Twitter的snowFlake算法
这篇内容大部分借鉴网络内容,整合在一起只为帮助自己和各位看官更好的理解snowFlake的原理
snowFlake 雪花算法
snowflake ID 算法是 twitter 使用的唯一 ID 生成算法,为了满足 Twitter 每秒上万条消息的请求,使每条消息有唯一、有一定顺序的 ID ,且支持分布式生成。
原理
其实很简单,只需要理解:某一台拥有独立标识(为机器分配独立id)的机器在1毫秒内生成带有不同序号的id
所以生成出来的id是具有时序性和唯一性的
构成
这里直接借鉴前人的整理,只为给大家更加清楚的讲解
snowflake ID 的结构是一个 64 bit 的 int 型数据。
- 第1位bit:
二进制中最高位为1的都是负数,但是我们所需要的id应该都是整数,所以这里最高位应该为0 - 后面的41位bit:
用