PHP ID生成器

<?php
/** 
 * Id生成器
 * Auth:乐杨俊
 * Class IdGenerator 
 */

namespace Leyangjun\Comm\Services\IdGenerator;

class IdGenerator
{
    private $_idGeneratorKey;

    private function __construct($idGeneratorKey = ''){
        if(!$idGeneratorKey){
            $this->_idGeneratorKey = 'default';
        }else{
            $this->_idGeneratorKey = $idGeneratorKey;
        }
    }

    /**
     * 发号
     * @param $business_id
     * @param int $num
     * @param null $configs
     * @return array|bool|mixed
     */
    public function get($business_id, $num = 1, $configs = null)
    {
        if ($business_id > pow(2, 6) || $business_id < 1) {
            // 超过业务池大小
            return false;
        }
        $app = App::getInstance();
        if (is_null($configs)) {
            $configs = $app->env('id_generator.default');
        }
        $FwIdGenerator = FwIdGenerator::getInstance($configs);

        $result = array();
        $num = abs(intval($num));
        for ($i = 0; $i < $num; ++$i) {
            if (isDevlopEnv() || isPreEnv()) {
                $id = $this->generateBusinessID($business_id);
            } else {
                $id = $FwIdGenerator->getId($business_id);
            }
            if (!$id) {
                //兼容本地策略
                $id = $this->generateBusinessID($business_id);
            }
            $result[] = $id;
        }
        if ($num == 1) {
            return $result[0];
        }
        return $result;
    }

    /**
     * 生成业务ID
     * @param int $business_id
     * @param int $created_at
     * @return bool|int
     */
    public function generateBusinessID($business_id = 1, $created_at = null)
    {
        if ($created_at) {
            $time = $created_at * 1000 + rand(0, 999);
        } else {
            $time = round(microtime(true) * 1000); //使用当前时间戳
        }

        if ($business_id > pow(2, 6)) {
            return false;
        }

        $increment = rand(0, pow(2, 9));
        $id = $time << (64 - 42);
        $id |= 0 << 16; // 写入IDC
        $id |= $business_id << 10; // 写入业务类型
        $id |= $increment;
        return $id;
    }
}

猜你喜欢

转载自blog.csdn.net/leyangjun/article/details/81539583