12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- <?php
- namespace app\common\controller;
- class SnowflakeId
- {
- const EPOCH = 1479533469598;
- const max12bit = 4095;
- const max41bit = 1099511627775;
- static $machineId = null;
- public static function machineId($mId = 0) {
- self::$machineId = $mId;
- }
- public static function generateParticle() {
- /*
- * Time - 42 bits
- */
- $time = floor(microtime(true) * 1000);
- /*
- * Substract custom epoch from current time
- */
- $time -= self::EPOCH;
- /*
- * Create a base and add time to it
- */
- $base = decbin(self::max41bit + $time);
- /*
- * Configured machine id - 10 bits - up to 1024 machines
- */
- if(!self::$machineId) {
- $machineid = self::$machineId;
- } else {
- $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);
- }
- /*
- * sequence number - 12 bits - up to 4096 random numbers per machine
- */
- $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);
- /*
- * Pack
- */
- $base = $base.$machineid.$random;
- /*
- * Return unique time id no
- */
- return bindec($base);
- }
- public static function timeFromParticle($particle) {
- /*
- * Return time
- */
- return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::EPOCH;
- }
- }
|