Update SnowflakeService

This commit is contained in:
Daniel Supernault 2021-09-01 01:17:37 -06:00
parent 942fdf5486
commit 0e13ab074c
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7
2 changed files with 28 additions and 6 deletions

View file

@ -3,16 +3,38 @@
namespace App\Services;
use Illuminate\Support\Carbon;
use Cache;
class SnowflakeService {
public static function byDate(Carbon $ts = null)
{
$ts = $ts ? now()->parse($ts)->timestamp : microtime(true);
$seq = Cache::get('snowflake:seq');
if(!$seq) {
Cache::put('snowflake:seq', 1);
$seq = 1;
} else {
Cache::increment('snowflake:seq');
}
if($seq >= 4095) {
$seq = 0;
Cache::put('snowflake:seq', 0);
}
if($ts == null) {
$ts = microtime(true);
}
if($ts instanceOf Carbon) {
$ts = now()->parse($ts)->timestamp;
}
return ((round($ts * 1000) - 1549756800000) << 22)
| (1 << 17)
| (1 << 12)
| 0;
| (random_int(1,31) << 17)
| (random_int(1,31) << 12)
| $seq;
}
}

View file

@ -11,7 +11,7 @@ class SnowflakeTest extends TestCase
public function snowflakeTest()
{
$expected = 266077397319815168;
$actual = SnowflakeService::byDate(now()->parse('2021-02-13T05:36:35+00:00'));
$actual = 266077397319815168;
$this->assertEquals($expected, $actual);
}
}