7
7
class LaraFlake
8
8
{
9
9
10
+ const INITIAL_EPOCH = 1451625443000 ;
11
+
12
+ const DEFAULT_SHARD_ID = 1 ;
13
+
10
14
/**
11
15
* Generate the 64bit unique ID.
12
16
* @return number BIGINT
@@ -19,10 +23,14 @@ public static function generateID()
19
23
*/
20
24
$ curr_timestamp = floor (microtime (true ) * 1000 );
21
25
26
+ if ( ! is_int (config ('laraflake.initial_epoch ' , self ::INITIAL_EPOCH )) ) {
27
+ throw new \InvalidArgumentException ('Initial epoch is invalid. Must be an integer ' );
28
+ }
29
+
22
30
/**
23
31
* Subtract custom epoch from current time
24
32
*/
25
- $ curr_timestamp -= config ('laraflake.initial_epoch ' );
33
+ $ curr_timestamp -= config ('laraflake.initial_epoch ' , self :: INITIAL_EPOCH );
26
34
27
35
/**
28
36
* Create a initial base for ID
@@ -33,6 +41,13 @@ public static function generateID()
33
41
* Get ID of database server (10 bits)
34
42
* Up to 512 machines
35
43
*/
44
+
45
+ $ node = self ::getServerShardId ();
46
+
47
+ if ( ! is_int ($ node ) || $ node < 0 || $ node > 1023 ) {
48
+ throw new \InvalidArgumentException ('The Shard ID identifier must be a 10 bit integer between 0 and 1023. ' );
49
+ }
50
+
36
51
$ shard_id = decbin (pow (2 ,9 ) - 1 + self ::getServerShardId ());
37
52
38
53
/**
@@ -59,6 +74,11 @@ public static function generateID()
59
74
*/
60
75
private static function getServerShardId ()
61
76
{
77
+
78
+ if (config ('laraflake.provider ' , 'local ' ) !== 'database ' ){
79
+ return config ('laraflake.shard_id ' , self ::DEFAULT_SHARD_ID );
80
+ }
81
+
62
82
try {
63
83
$ database_name = DB ::getName ();
64
84
}catch (\PDOException $ e ){
@@ -90,6 +110,6 @@ private static function getMySqlServerId()
90
110
*/
91
111
public static function getTimeFromID ($ id )
92
112
{
93
- return bindec (substr (decbin ($ id ),0 ,41 )) - pow (2 ,40 ) + 1 + config ('laraflake.initial_epoch ' );
113
+ return bindec (substr (decbin ($ id ),0 ,41 )) - pow (2 ,40 ) + 1 + config ('laraflake.initial_epoch ' , self :: INITIAL_EPOCH );
94
114
}
95
115
}
0 commit comments