generateUUIDTimeBin(); $firstStr = $this->generateUUIDFirstBin(); $secondStr = $this->generateUUIDSecondBin($timeStr); $thirdStr = $this->generateUUIDThirdBin($timeStr, $table); $firstStr36 = $this->fixLength(base_convert($firstStr, 2, 36), $this->first36Length); $secondStr36 = $this->fixLength(base_convert($secondStr, 2, 36), $this->second36Length); $thirdStr36 = $this->fixLength(base_convert($thirdStr, 2, 36), $this->third36Length); return $firstStr36.$secondStr36.$thirdStr36; } private function generateBin($number = 0, $length = 0) { return $this->fixLength(decbin($number), $length); } private function getMillisecond() { list($msec, $sec) = explode(' ', microtime()); $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); return substr($msectime,0,13); } private function generateUUIDTimeBin() { $timestamp = $this->getMillisecond(); // return $this->fixLength(decbin($timestamp - $this->startTime), $this->timeLength); return $this->fixLength(decbin(TimeUtils::getMillisecond() - $this->startTime), $this->timeLength); } private function generateUUIDFirstBin() { $flagStr = $this->generateBin($this->flag, $this->flagLength); $envStr = $this->generateBin($this->env, $this->envLength); $dbStr = $this->generateBin($this->db, $this->dbLength); $serverStr = $this->generateBin($this->server, $this->serverLength); return $flagStr.$envStr.$dbStr.$serverStr; } private function generateUUIDSecondBin($timeStr) { $startTimeStr = substr($timeStr, 0, $this->secondLength); return $startTimeStr; } private function generateUUIDThirdBin($timeStr, $table = -1) { $endTimeStr = substr($timeStr, $this->secondLength); $random = $this->generateRandom(1 << $this->randomLength); $table = $table === -1 ? $this->generateRandom(1 << $this->tableLength) : $table; $randomStr = $this->generateBin($random, $this->randomLength); $tableStr =$this->generateBin($table, $this->tableLength); return $endTimeStr.$randomStr.$tableStr; } private function generateRandom($max) { return rand(0, $max); } public function _pasreUUID($uuid) { $firstStr36 = substr($uuid, 0, $this->first36Length); $secondStr36 = substr($uuid, $this->first36Length, $this->second36Length); $thirdStr36 = substr($uuid, $this->first36Length + $this->second36Length); $firstStr = $this->pasreBin($firstStr36, $this->firstLength); $secondStr = $this->pasreBin($secondStr36, $this->secondLength); $thirdStr = $this->pasreBin($thirdStr36, $this->thirdLength); [ 'flag' => $flag, 'env' => $env, 'db' => $db, 'server' => $server ] = $this->pasreExpand($firstStr); $beforeTime = $secondStr; [ 'afterTime' => $afterTime, 'random' => $random, 'table' => $table, ] = $this->pasreThirdStr($thirdStr); $timestamp = $this->startTime + bindec($beforeTime.$afterTime); return [ 'flag' => $flag, 'env' => $env, 'db' => $db, 'server' => $server, 'timestamp' => $timestamp, 'random' => $random, 'table' => $table, ]; } private function pasreBin($str, $length) { return $this->fixLength(base_convert($str, 36, 2), $length); } private function pasreExpand($firstStr) { $flag = bindec(substr($firstStr, 0 , $this->flagLength)); $env = bindec(substr($firstStr, $this->flagLength , $this->envLength)); $db = bindec(substr($firstStr, $this->flagLength + $this->envLength, $this->dbLength)); $server = bindec(substr($firstStr, $this->flagLength + $this->envLength + $this->dbLength)); return [ 'flag' => $flag, 'env' => $env, 'db' => $db, 'server' => $server ]; } private function pasreThirdStr($thirdStr) { $afterTime = substr($thirdStr, 0, $this->timeLength - $this->secondLength); $random = bindec(substr($thirdStr, $this->timeLength - $this->secondLength, $this->randomLength)); $table = bindec(substr($thirdStr, $this->timeLength - $this->secondLength + $this->randomLength)); return [ 'afterTime' => $afterTime, 'random' => $random, 'table' => $table, ]; } public function _pasreTable($uuid) { $thirdStr36 = substr($uuid, $this->first36Length + $this->second36Length); $thirdStr = $this->pasreBin($thirdStr36, $this->thirdLength); [ 'table' => $table, ] = $this->pasreThirdStr($thirdStr); return $table; } }