用来生成类似于 Twitter 雪花算法的 64 位识别码。
安装
1 2 3
| composer require "kra8/laravel-snowflake"
php artisan vendor:publish --provider="Kra8\Snowflake\Providers\LaravelServiceProvider"
|
用例
获取实例
1
| $snowflake = $this->app->make('Kra8\Snowflake\Snowflake');
|
或者
1
| $snowflake = app('Kra8\Snowflake\Snowflake');
|
生成雪花算法标识码
1
| $id = $snowflake->next();
|
在 Eloquent 中使用
将 Kra8\Snowflake\HasSnowflakePrimary trait 添加到 Eloquent 模型。该 trait 实现了将数据库主键设置为雪花算法生成的ID类型,并自动将 $incrementing 属性设置为 false。
1 2 3 4 5 6 7 8 9 10 11
| <?php namespace App;
use Kra8\Snowflake\HasSnowflakePrimary; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable { use HasSnowflakePrimary, Notifiable; }
|
Column type id is supported.
1 2 3 4 5 6 7 8 9 10 11
| public function up(): void { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); }
|
JavaScript 支持
由于JavaScript无法处理64位整数,因此还提供了 HasShortPrimary trait,它会生成一个可由JavaScript 处理的 53 位整数 ID。
使用方法:只需将 HasSnowflakePrimary 替换为 HasShortPrimary 即可。
1 2 3 4 5 6 7 8 9 10 11
| <?php namespace App;
use Kra8\Snowflake\HasShortflakePrimary; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable { use HasShortflakePrimary, Notifiable; }
|
技术说明:
JavaScript 的 Number 类型仅支持53位整数精度(IEEE 754双精度限制),而雪花算法生成的ID通常是64位。HasShortPrimary 通过压缩时间戳/工作节点等位域,生成兼容JavaScript的53位ID变体。
参考:
kra8/laravel-snowflake: This Laravel package to generate 64 bit identifier like the snowflake within Twitter.