pixelfed/app/Services/SnowflakeService.php

47 lines
790 B
PHP
Raw Normal View History

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)
{
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)
| $seq;
}
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);
$seq = 0;
2021-09-01 07:17:37 +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
}