原理介绍:

Snowflake的核心思想是将64bit的二进制数字分成若干部分,每一部分都存储有特定含义的数据,比如说时间戳、机房ID、机器ID、序列号等等,最终生成全局唯一的有序ID。它的标准算法是这样的:

0       0000000000000000000000000000000000000000  0000000000   000000000000
符号位  41位时间戳,大约够69年                    10位(机房+机器ID)  12位序列号

具体位数怎么分配,其实可以根据自己的情况来,比如如果只有两个机器,那么用10位显然是浪费的,根据自己情况分配即可

相关知识:

二进制转十进制:

比如 11010[2进制] = 1X2^4+1X2^3+0X2^2+1X2^1+0X2^0
=26[10进制],二进制数转换成十进制数的方法是按权展开就是这样做的
注:2^4表示2的4次方,任何非0数字的0次方都等于1

十进制转二进制:

789=1100010101
789/2=394 余1 第10位
394/2=197 余0 第9位
197/2=98 余1 第8位
98/2=49 余0 第7位
49/2=24 余1 第6位
24/2=12 余0 第5位
12/2=6 余0 第4位
6/2=3 余0 第3位
3/2=1 余1 第2位
1/2=0 余1 第1位最后把余数从下往上连起来即为: 1100010101

PHP实现

<?php
/***  分布式 id 生成类     组成: <毫秒级时间戳+机房id+机器id+序列号>*  默认情况下41bit的时间戳可以支持该算法使用69年,5bit的机房id可以支持31台机器,5bit的工作机器id可以支持31台机器,序列号支持1毫秒产生4095个自增序列id*/
class IdCreate
{const EPOCH = 1640856551866;    //开始时间,固定一个小于当前时间的毫秒数,这样后续的时间戳毫秒基于此开始时间才能达到69年;const max12bit = 4095;static $dataCenterId = null;      // 机房idstatic $machineId = null;      // 机器idpublic static function createOnlyId($dataCenterId = 0,$machineId = 0){self::$machineId = $machineId;self::$dataCenterId = $dataCenterId;// 时间戳 41字节$time = floor(microtime(true) * 1000);// 当前时间 与 开始时间 差值,这样就可以有69年的时间$time -= self::EPOCH;// 二进制的 毫秒级时间戳$timeStr = str_pad(decbin($time), 41, "0", STR_PAD_LEFT);// 机房id  5 字节$dataCenterId = str_pad(decbin(self::$dataCenterId), 5, "0", STR_PAD_LEFT);// 机器id  5 字节$machineId = str_pad(decbin(self::$machineId), 5, "0", STR_PAD_LEFT);// 序列数 12字节$random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);//正常应该搞自增id,这里为了演示,所以用了随机数,使用redis的自增id比较好://REDIS::incr($time.self::$dataCenterId.self::$machineId);// 拼接$base = $timeStr.$dataCenterId.$machineId.$random;// 转化为 十进制 返回return bindec($base);}
}$dataCenterId = 2;$machineId = 1;$cast_id = IdCreate::createOnlyId($dataCenterId,$machineId);echo $cast_id;

生成唯一值

13648311620966

php简洁版雪花算法Snowflake相关推荐

  1. Twitter的分布式雪花算法 SnowFlake 每秒自增生成26个万个可排序的ID (Java版)

    分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...

  2. Twitter的分布式雪花算法 SnowFlake

    为什么80%的码农都做不了架构师?>>>    原理 Twitter的雪花算法SnowFlake,使用Java语言实现. SnowFlake算法产生的ID是一个64位的整型,结构如下 ...

  3. java 有穷自动机_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

  4. java雪花_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

  5. mysql snowflake_雪花算法-snowflake

    雪花算法-snowflake 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有 ...

  6. 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

    文章目录 一.前言 二.雪花算法snowflake 1.基本定义 2.snowflake的优缺点 三.Java代码实现snowflake 1.组装生成id 2.计算最大值的几种方式 3.反解析ID 4 ...

  7. 发号器:雪花算法(Snowflake)

    雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器. 第一个bit位(1bit):Ja ...

  8. 雪花算法-Snowflake Snowflake

    雪花算法-Snowflake Snowflake,雪花算法是由Twitter开源的分布式ID生成算法,以划分命名空间的方式将 64-bit位分割成多个部分,每个部分代表不同的含义.而 Java中64b ...

  9. 雪花算法(snowflake)容器化部署支持动态增加节点

    先简单的介绍一下雪花算法,雪花算法生成的Id由:1bit 不用 + 41bit时间戳+10bit工作机器id+12bit序列号,如下图: 不用:1bit,因为最高位是符号位,0表示正,1表示负,所以这 ...

最新文章

  1. 2022-2028年中国LCD光刻胶行业市场深度分析及发展规模预测报告
  2. 【UOJ#188】Sanrd(min_25筛)
  3. css点滴知识汇集(转+编辑)
  4. 【第7篇】Python爬虫实战-收集gitee中的issue问题
  5. java.sql.SQLSyntaxErrorException: Unknown column ‘###‘ in ‘field list‘
  6. C语言字符串中运算符,c语言字符串中找到一个运算符,怎样实现运算
  7. 阿里云10 PB+/天的日志系统设计和实现
  8. 每个叶子节点(nil)是黑色。_129. 求根到叶子节点数字之和
  9. 2022年危险化学品生产单位安全生产管理人员试题模拟考试平台操作
  10. IOS视频播放器缓存
  11. java数字金额大写金额_Java实现 将数字金额转为大写中文金额
  12. ie浏览器文档模式设置
  13. js判断对象是否有某个属性
  14. UIPATH 结合 Python 识别 PDF 中的表格
  15. php 歌词同步,HTML5实践之歌词同步播放器的示例代码分享
  16. {  周赛  }又被虐爆了
  17. 钙钛矿型复合氧化物高熵陶瓷/过渡金属碳氮化物高熵陶瓷/固体氧化物燃料电池(SOFC)材料
  18. Python PymySQl 下载安装配置
  19. JESD79-4 第5章 片上终结电阻ODT(5.1-5.3)
  20. Android 10.0 蓝牙去掉传输文件的功能

热门文章

  1. 《程序员》6期精彩内容:移动应用的成功法则
  2. ZoomIt 屏幕缩放演示软件 使用
  3. Apache SparkStreaming 统计一定时间内的热门词汇TopN
  4. C语言关于飞机躲子弹的游戏,团队项目(2.1) -- 飞机躲避小游戏
  5. Robotstudio出现未定义错误解决办法
  6. 谷哥学术2022年2月份资源分享下载列表 011/20
  7. N76、MS51的下载电路图
  8. Foxbase 命令集
  9. [英语语法]词法之数词
  10. deepin系统如何安装惠普打印机