雪花算法

 <?php
    namespace App\Services;
    /**
     * 分布式 id 生成类     组成: <毫秒级时间戳+机器id+序列号>
     * 默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,
      *序列号支持1毫秒产生4095个自增序列id
     * @author zhangqi
     */
    class IdCreate
    {
      const EPOCH = 1479533469598; //开始时间,固定一个小于当前时间的毫秒数\
      const max12bit = 4095;
      const max41bit = 1099511627775;

      static $machineId = null; // 机器id

      public static function machineId($mId = 0)
      {
             self::$machineId = $mId;
      }
      public static function createOnlyId()
     {
         // 时间戳 42字节
         $time = floor(microtime(true) * 1000);
          // 当前时间 与 开始时间 差值
        $time -= self::EPOCH;
        // 二进制的 毫秒级时间戳
        $base = decbin(self::max41bit + $time);
        // 机器id  10 字节
           if (!self::$machineId) {
                   $machineid = self::$machineId;
             } else {
                    $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);\
              }
             // 序列数 12字节
              $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);\
              // 拼接
              $base = $base . $machineid . $random;
              // 转化为 十进制 返回
              return bindec($base);
             }
    }

    调用  IdCreate::createOnlyId(1);
           返回的值   // 2219944901359
           返回的值 // 2220004015923
           返回的值 // 2220062766757
           返回的值     // 2220119764908
本作品采用《CC 协议》,转载必须注明作者和本文链接
有梦想的人睡不着,没有梦想的人睡不醒。
讨论数量: 1

“机器id 10 字节”这个里面的提到的字节应称为位。还有最后一串的随机数组成,无法保证绝对的唯一性

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
文章
88
粉丝
21
喜欢
134
收藏
267
排名:228
访问:4.2 万
私信
所有博文
博客标签
redis
1
php
1
laravel
7
docker
3
orm
2
sync
1
pivot
1
detach
2
attach
2
算法
1
递归
1
多对多
1
lnmp环境搭建
1
GO变量
1
GO数据类型
1
IOC注入反转
1
IOC容器的绑定解析过程(绑定单例)
1
原生微信网页授权登录(natapp穿墙)
1
VMwareNAT网卡配置
1
MySQL基础架构
1
redis 主从搭建
1
Sentinel哨兵模式解决故障转移
1
elasticsearch安装
1
elasticsearch集群安装3台
1
安装kibana
1
必须了解的mysql三大日志-binlog、redo log和undo log
1
何处理数据恢复 数据丢失 面试tx的架构师的岗位问的
1
分库分表插入数据
1
创建分库分表(在主从复制的基本上)
1
分库分表总结
1
mysql总结
1
haproxy状态检测脚本(完成高可用)
1
mysql高可用衡搭建(Keepalived)
1
mysql负载均衡搭建(haproxy)
1
mysql主从恢复数据一致性(pt工具-t-table-checksum和pt-table-sync)
1
终于解决了《====》记一次mysql热备份xtrabackup(没有解决问题)
1
mysql事务
1
MYSQL8.0安装
1
Redis-cluster分布式集群搭建部署
1
比Redis-cluster还好的redis分布式集群(twemproxy)
1
Redis缓存穿透/缓存雪崩/缓存击穿(案例:产生的原因 解决方案利/弊)
1
数据结构之MySQL独爱B+树(二叉树、AVL树、红黑树、B树对比)
1
B-tree
1
B+tree
1
Mycat实现mysql的负载均衡读写分离
2
mysql双主双从 搭建配置
1
mycat 双主双从-负载均衡-高可用
1
Mycat垂直分库
1
记一次mysql高可用技术分享
1
【rabbitmq】安装ampq的扩展的踩坑总结
1
PHP操作MongoDB(增删改查)
1
golang总结
5
社区赞助商