Snowflake 是 Twitter 内部的一个 ID 生算法,可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码。

其组成为:

第一个 bit 为未使用的符号位。

第二部分由 41 位的时间戳(毫秒)构成,他的取值是当前时间相对于某一时间的偏移量。

第三部分和第四部分的 5 个 bit 位表示数据中心和机器ID,其能表示的最大值为 2^5 -1 = 31;

最后部分由 12 个 bit 组成,其表示每个工作节点每毫秒生成的序列号 ID,同一毫秒内最多可生成 2^12 -1 即 4095 个 ID。

需要注意的是:

在分布式环境中,5 个 bit 位的 datacenter 和 worker 表示最多能部署 31 个数据中心,每个数据中心最多可部署 31 台节点。

41 位的二进制长度最多能表示 2^41 -1 毫秒即 69 年,所以雪花算法最多能正常使用 69 年,为了能最大限度的使用该算法,你应该为其指定一个开始时间。

由上可知,雪花算法生成的 ID 并不能保证唯一,如当两个不同请求同一时刻进入相同的数据中心的相同节点时,而此时该节点生成的 sequence 又是相同时,就会导致生成的 ID 重复。

所以要想使用雪花算法生成唯一的 ID,就需要保证同一节点同一毫秒内生成的序列号是唯一的。基于此,我们在 SDK 中集成了多种序列号提供者:

RandomSequenceResolver(随机生成)

RedisSequenceResolver (基于 redis psetex 和 incrby 生成)

LaravelSequenceResolver(基于 redis psetex 和 incrby 生成)

SwooleSequenceResolver(基于 swoole_lock 锁)

不同的提供者只需要保证同一毫秒生成的序列号不同,就能得到唯一的 ID,最后附上 项目 和 博客 地址,欢迎大家围观。

要求

PHP >= 7.0

安装

$ composer require godruoyi/php-snowflake -vvv

使用

简单使用.

$snowflake = new \Godruoyi\Snowflake\Snowflake;

$snowflake->id();

// 1537200202186752

指定数据中心ID及机器ID.

$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId);

$snowflake->id();

指定开始时间.

$snowflake = new \Godruoyi\Snowflake\Snowflake;

$snowflake->setStartTimeStamp(strtotime('2019-09-09')*1000);

$snowflake->id();

高级

在 Laravel 中使用

因为 SDK 相对简单,我们并没有提供 Laravel 的扩展包,你可通过下面的方式快速集成到 Laravel 中。

// App\Providers\AppServiceProvider

use Godruoyi\Snowflake\Snowflake;

use Godruoyi\Snowflake\LaravelSequenceResolver;

class AppServiceProvider extends ServiceProvider

{

/**

* Register any application services.

*

* @return void

*/

public function register()

{

$this->app->singleton('snowflake', function () {

return (new Snowflake())

->setStartTimeStamp(strtotime('2019-08-08')*1000)

->setSequenceResolver(new LaravelSequenceResolver(

$this->app->get('cache')->store()

));

});

}

}

自定义序列号解决器

你可以通过实现 Godruoyi\Snowflake\SequenceResolver 接口来自定义序列号解决器。

class YourSequence implements SequenceResolver

{

/**

* {@inheritdoc}

*/

public function sequence(int $currentTime)

{

// Just test.

return mt_rand(0, 1);

}

}

// usage

$snowflake->setSequenceResolver(new YourSequence);

$snowflake->id();

你也可以直接使用闭包:

$snowflake = new \Godruoyi\Snowflake\Snowflake;

$snowflake->setSequenceResolver(function ($currentTime) {

static $lastTime;

static $sequence;

if ($lastTime == $currentTime) {

++$sequence;

}

$lastTime = $currentTime;

return $sequence;

})->id();

如果您在使用过程中遇到任何问题,欢迎提交 「PR」。

本作品采用《CC 协议》,转载必须注明作者和本文链接

二愣的闲谈杂鱼

php绘制雪花墙,基于雪花算法的 PHP ID 生成器相关推荐

  1. 基于雪花算法生成用户id

    8.1 为啥这样做 1.全局唯一性,不会出现重复的id.如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行 ...

  2. 雪花算法之唯一ID生成器理解

    雪花算法基本情况 雪花算法是一个分布式的唯一ID生成器. 它应该具有高并发,以及高性能优点. 基于时间戳,ID具有有序性,同时分布式下机器间时间差异过大(类似同一台机器时间回拨,一定会重复),会导致重 ...

  3. 推特雪花算法,分布式id生成器

    推特雪花算法 分布式id生成器 package util;import java.lang.management.ManagementFactory; import java.net.InetAddr ...

  4. 注意:雪花算法并不是ID的唯一选择!

    Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 在<悟空传>篇外篇里,有一个忧伤的故事. 秋天,树上掉下两片叶子,你要和它们说再见.但你如何知道这片叶子,不是另外一片叶 ...

  5. DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法

    DefaultIdentifierGenerator 雪花算法 生成 重复 id 前言 问题发生 排查原因 问题解决 前言 利用 mybatisplus 的 DefaultIdentifierGene ...

  6. python版雪花算法生成唯一ID

    一.雪花算法图解 理论一大堆,总结如下图: 下方为源码,返回的结果为19位,为10进制表示,使用二进制表示就是64位,所以不必有所疑惑. 二.源码 1.异常捕获块 文件名:exceptions.py ...

  7. 雪花算法【分布式ID问题】【刘新宇】

    分布式ID 1 方案选择 UUID UUID是通用唯一识别码(Universally Unique Identifier)的缩写,开放软件基金会(OSF)规范定义了包括网卡MAC地址.时间戳.名字空间 ...

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

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

  9. 分布式下使用雪花算法生成全局ID及解决时钟回拨问题

    简介 雪花算法是 64 位 的二进制,一共包含了四部分: 1位是符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数 41位是时间戳,具体到毫秒,41位的二 ...

最新文章

  1. 前端学习(2633):父子传值
  2. 【ZOJ - 3210】A Stack or A Queue? (模拟)
  3. 安装ORACLE 时报错 /jre/1.4.2/lib/i386/libawt.so:
  4. 台式机电脑配置单_游戏直播电脑配置要求2019,附配置单及价格
  5. Android关闭Activity
  6. 图像处理基础(三)_像素之间的3种关系
  7. 剑指offer-06-旋转数组的最小数字
  8. 搭建离线版keras中文文档
  9. 【滤波器】最小均方(LMS)自适应滤波器
  10. 【3dmax千千问】初学3dmax插件神器第23课:3dmax自学渲染进阶提升教程|疯狂模渲大师排除了特殊的材质后,室内设计师还要去除VRAY的光线追踪,再设计3dmax效果图!
  11. 在树莓派3上使用红外遥控器控制libreELEC和Raspbian系统
  12. Linux--进程与任务管理(查看和控制进程及计划任务管理)
  13. labview文件写入与读取
  14. 所有男生女生看了都会感动的分手理由(天堂杂志转贴)
  15. 解决 Navigating to current location (/userslist) is not allowed问题。
  16. w7电脑蓝屏怎么解决_win7家用版_电脑老是蓝屏怎么办? - Win7之家
  17. 简述华为的鸿蒙操作系统的结构,华为鸿蒙操作系统今日重磅发布
  18. 数据库及SQL语句入门教程
  19. 字符串函数剖析(3)---strstr函数
  20. SQL获取当前周的开始日期和结束日期

热门文章

  1. Web应用中优化IBatis性能
  2. Android 软键盘盖住输入框的问题
  3. Android中ICS4.0Launcher中Fold的功能详解【androidICS4.0--Launcher系列三】
  4. 阿里云、天津开启多项合作,区域经济大脑落地津南
  5. Redis集群搭建与简单使用
  6. nodejs中的模块的理解
  7. jquery选择器详解
  8. yii2 controller 接收get形式传输过来的参数
  9. android 应用的资源
  10. noSql-redis