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; namespace App\Services;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use Cache;
class SnowflakeService { class SnowflakeService {
public static function byDate(Carbon $ts = null) 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) return ((round($ts * 1000) - 1549756800000) << 22)
| (1 << 17) | (random_int(1,31) << 17)
| (1 << 12) | (random_int(1,31) << 12)
| 0; | $seq;
} }
} }

View file

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