Snowflake 是 Twitter 内部的一个 ID 生算法,能够经过一些简单的规则保证在大规模分布式状况下生成惟一的 ID 号码。php
其组成为:git
须要注意的是:github
由上可知,雪花算法生成的 ID 并不能保证惟一,如当两个不一样请求同一时刻进入相同的数据中心的相同节点时,而此时该节点生成的 sequence 又是相同时,就会致使生成的 ID 重复。redis
因此要想使用雪花算法生成惟一的 ID,就须要保证同一节点同一毫秒内生成的序列号是惟一的。基于此,咱们在 SDK 中集成了多种序列号提供者:算法
不一样的提供者只须要保证同一毫秒生成的序列号不一样,就能获得惟一的 ID。shell
$ composer require godruoyi/php-snowflake -vvv
复制代码
$snowflake = new \Godruoyi\Snowflake\Snowflake;
$snowflake->id();
// 1537200202186752
复制代码
$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId);
$snowflake->id();
复制代码
$snowflake = new \Godruoyi\Snowflake\Snowflake;
$snowflake->setStartTimeStamp(strtotime('2019-09-09')*1000);
$snowflake->id();
复制代码
由于 SDK 相对简单,咱们并无提供 Laravel 的扩展包,你可经过下面的方式快速集成到 Laravel 中。bash
// 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-10-10')*1000)
->setSequenceResolver(new LaravelSequenceResolver($this->app->get('cache')->store()));
});
}
}
复制代码
你能够经过实现 Godruoyi\Snowflake\SequenceResolver 接口来自定义序列号解决器。swoole
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();
复制代码
若是您在使用过程当中遇到任何问题,欢迎提交 「PR」。app