diff --git a/app/Services/SnowflakeService.php b/app/Services/SnowflakeService.php index b04c56b40..e7833e091 100644 --- a/app/Services/SnowflakeService.php +++ b/app/Services/SnowflakeService.php @@ -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; } -} \ No newline at end of file +} diff --git a/tests/Unit/SnowflakeTest.php b/tests/Unit/SnowflakeTest.php index 0ab3b0e6e..7696dfb13 100644 --- a/tests/Unit/SnowflakeTest.php +++ b/tests/Unit/SnowflakeTest.php @@ -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); } }