Bläddra i källkod

Update SnowflakeService

Daniel Supernault 3 år sedan
förälder
incheckning
0e13ab074c
2 ändrade filer med 28 tillägg och 6 borttagningar
  1. 27 5
      app/Services/SnowflakeService.php
  2. 1 1
      tests/Unit/SnowflakeTest.php

+ 27 - 5
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;
 	}
 
-}
+}

+ 1 - 1
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);
     }
 }