php绘制雪花墙,基于雪花算法的 PHP ID 生成器
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 生成器相关推荐
- 基于雪花算法生成用户id
8.1 为啥这样做 1.全局唯一性,不会出现重复的id.如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行 ...
- 雪花算法之唯一ID生成器理解
雪花算法基本情况 雪花算法是一个分布式的唯一ID生成器. 它应该具有高并发,以及高性能优点. 基于时间戳,ID具有有序性,同时分布式下机器间时间差异过大(类似同一台机器时间回拨,一定会重复),会导致重 ...
- 推特雪花算法,分布式id生成器
推特雪花算法 分布式id生成器 package util;import java.lang.management.ManagementFactory; import java.net.InetAddr ...
- 注意:雪花算法并不是ID的唯一选择!
Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记! 在<悟空传>篇外篇里,有一个忧伤的故事. 秋天,树上掉下两片叶子,你要和它们说再见.但你如何知道这片叶子,不是另外一片叶 ...
- DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法
DefaultIdentifierGenerator 雪花算法 生成 重复 id 前言 问题发生 排查原因 问题解决 前言 利用 mybatisplus 的 DefaultIdentifierGene ...
- python版雪花算法生成唯一ID
一.雪花算法图解 理论一大堆,总结如下图: 下方为源码,返回的结果为19位,为10进制表示,使用二进制表示就是64位,所以不必有所疑惑. 二.源码 1.异常捕获块 文件名:exceptions.py ...
- 雪花算法【分布式ID问题】【刘新宇】
分布式ID 1 方案选择 UUID UUID是通用唯一识别码(Universally Unique Identifier)的缩写,开放软件基金会(OSF)规范定义了包括网卡MAC地址.时间戳.名字空间 ...
- 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论
文章目录 一.前言 二.雪花算法snowflake 1.基本定义 2.snowflake的优缺点 三.Java代码实现snowflake 1.组装生成id 2.计算最大值的几种方式 3.反解析ID 4 ...
- 分布式下使用雪花算法生成全局ID及解决时钟回拨问题
简介 雪花算法是 64 位 的二进制,一共包含了四部分: 1位是符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数 41位是时间戳,具体到毫秒,41位的二 ...
最新文章
- 前端学习(2633):父子传值
- 【ZOJ - 3210】A Stack or A Queue? (模拟)
- 安装ORACLE 时报错 /jre/1.4.2/lib/i386/libawt.so:
- 台式机电脑配置单_游戏直播电脑配置要求2019,附配置单及价格
- Android关闭Activity
- 图像处理基础(三)_像素之间的3种关系
- 剑指offer-06-旋转数组的最小数字
- 搭建离线版keras中文文档
- 【滤波器】最小均方(LMS)自适应滤波器
- 【3dmax千千问】初学3dmax插件神器第23课:3dmax自学渲染进阶提升教程|疯狂模渲大师排除了特殊的材质后,室内设计师还要去除VRAY的光线追踪,再设计3dmax效果图!
- 在树莓派3上使用红外遥控器控制libreELEC和Raspbian系统
- Linux--进程与任务管理(查看和控制进程及计划任务管理)
- labview文件写入与读取
- 所有男生女生看了都会感动的分手理由(天堂杂志转贴)
- 解决 Navigating to current location (/userslist) is not allowed问题。
- w7电脑蓝屏怎么解决_win7家用版_电脑老是蓝屏怎么办? - Win7之家
- 简述华为的鸿蒙操作系统的结构,华为鸿蒙操作系统今日重磅发布
- 数据库及SQL语句入门教程
- 字符串函数剖析(3)---strstr函数
- SQL获取当前周的开始日期和结束日期