首页 » Web前端 » snowflake算法php技巧_Twitter雪花算法PHP实现库Snowflake

snowflake算法php技巧_Twitter雪花算法PHP实现库Snowflake

duote123 2024-11-11 0

扫一扫用手机浏览

文章目录 [+]

雪花算法构造

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;

实行输出

snowflake算法php技巧_Twitter雪花算法PHP实现库Snowflake

663985260597348711

指天命据中央ID及机器ID

snowflake算法php技巧_Twitter雪花算法PHP实现库Snowflake
(图片来自网络侵删)

$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。

相关文章

htaccessphp支撑技巧_htaccess设备详解

- .htaccess 文件(或者\公众分布式配置文件\公众 供应了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包...

Web前端 2024-12-10 阅读0 评论0