雪花算法构造
Snowflake算法天生的ID由64位组成,个中各部分的位数如下所示:
1位符号位 | 41位韶光戳 | 10位事情机器ID | 12位序列号
符号位:始终为0,担保天生的ID为正整数。由于二进制里第一个 bit 为如果是 1,那么都是负数,但是我们天生的 id 都是正数,以是第一个 bit 统一都是 0。韶光戳:利用41位来表示当前韶光戳,精确到毫秒级,可以利用69年。41 bit 可以表示的数字多达 2^41 - 1,也便是可以标识 2 ^ 41 - 1 个毫秒值,换算成年便是表示 69 年的韶光。事情机器ID:用于区分不同的事情节点,可以分配的事情机器ID范围为0~1023。但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思便是最多代表 2 ^ 5 个机房(32 个机房),每个机房里可以代表 2 ^ 5 个机器(32 台机器),这里可以随意拆分,比如拿出4位标识业务号,其他6位作为机器号。可以随意组合。序列号:用于办理同一毫秒内并发生成多个ID的冲突问题,可以支持每毫秒最多天生4096个ID。12 bit 可以代表的最大正整数是 2 ^ 12 - 1 = 4096,也便是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。也便是同一毫秒内同一台机器所天生的最大ID数量为4096安装
composer require godruoyi/php-snowflake -vvv
大略利用
<?php/ @desc snowflake @author Tinywan(ShaoBo Wan) @date 2024/8/14 22:45 /require '../vendor/autoload.php';$snowflake = new \Godruoyi\Snowflake\Snowflake;echo $snowflake->id() . PHP_EOL;
实行输出
663985260597348711
指天命据中央ID及机器ID

$datacenterId = time();$workerId = '1000000000000001';$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId);echo $snowflake->id() . PHP_EOL;
实行输出
663986323404837079
指定开始韶光
$snowflake = new \Godruoyi\Snowflake\Snowflake;$snowflake->setStartTimeStamp(strtotime('2020-08-15')1000);echo $snowflake->id() . PHP_EOL;
实行输出
528938994126294755
高等用法
在 Laravel 中利用
可通过下面的办法快速集成到 Laravel 中
// App\Providers\AppServiceProvideruse 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 ($app) { return (new Snowflake()) ->setStartTimeStamp(strtotime('2019-10-10')1000) ->setSequenceResolver(new LaravelSequenceResolver($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; } else { $sequence = 0; } $lastTime = $currentTime; return $sequence;})->id();
小结
本文先容了Snowflake算法的事理,并利用PHP实现的Snowflake天生器。Snowflake算法可以在分布式系统中天生唯一的、趋势递增的ID,并且不依赖于中心做事器。
在实际运用中,我们可以将Snowflake天生器集成到分布式系统中,用于天生全局唯一的ID,知足分布式环境下的唯一ID需求。希望本文的先容能够帮助读者理解Snowflake算法的实现事理,并在实际开拓中利用Snowflake天生器天生分布式唯一ID。