2021-01-13 04:50:45 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
|
|
|
use Illuminate\Support\Carbon;
|
2021-09-01 07:17:37 +00:00
|
|
|
use Cache;
|
2021-01-13 04:50:45 +00:00
|
|
|
|
|
|
|
class SnowflakeService {
|
|
|
|
|
|
|
|
public static function byDate(Carbon $ts = null)
|
2021-09-02 04:46:57 +00:00
|
|
|
{
|
|
|
|
if($ts instanceOf Carbon) {
|
|
|
|
$ts = now()->parse($ts)->timestamp;
|
|
|
|
} else {
|
|
|
|
return self::next();
|
|
|
|
}
|
|
|
|
|
|
|
|
return ((round($ts * 1000) - 1549756800000) << 22)
|
|
|
|
| (random_int(1,31) << 17)
|
|
|
|
| (random_int(1,31) << 12)
|
2021-09-04 02:51:05 +00:00
|
|
|
| 0;
|
2021-09-02 04:46:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public static function next()
|
2021-01-13 04:50:45 +00:00
|
|
|
{
|
2021-09-01 07:17:37 +00:00
|
|
|
$seq = Cache::get('snowflake:seq');
|
|
|
|
|
|
|
|
if(!$seq) {
|
|
|
|
Cache::put('snowflake:seq', 1);
|
|
|
|
$seq = 1;
|
|
|
|
} else {
|
|
|
|
Cache::increment('snowflake:seq');
|
|
|
|
}
|
|
|
|
|
|
|
|
if($seq >= 4095) {
|
|
|
|
Cache::put('snowflake:seq', 0);
|
2021-09-02 04:46:57 +00:00
|
|
|
$seq = 0;
|
2021-09-01 07:17:37 +00:00
|
|
|
}
|
|
|
|
|
2021-09-02 04:46:57 +00:00
|
|
|
return ((round(microtime(true) * 1000) - 1549756800000) << 22)
|
2021-09-01 07:17:37 +00:00
|
|
|
| (random_int(1,31) << 17)
|
|
|
|
| (random_int(1,31) << 12)
|
|
|
|
| $seq;
|
2021-01-13 04:50:45 +00:00
|
|
|
}
|
|
|
|
|
2021-09-01 07:17:37 +00:00
|
|
|
}
|