晓夏

北漂的女孩

Good Luck To You!

雪花算法id生成器

浏览量:208

<?php
/**
 * Created by PhpStorm.
 * User: lhj
 * Date: 2020/11/18
 * Time: 9:39
 */
/**
 * 雪花算法id生成器
 * Class SnowFlake
 * @package app\base\utils
 * @author lhj
 */
class IdGenerator
{
    const EPOCH = 1479533469598;    //开始时间,固定一个小于当前时间的毫秒数
    const max12bit = 4095;
    const max41bit = 1099511627775;

    const MACHINEID = "machineId";  //配置里的机器id的key

    static $machineId = null;      // 机器id
    static $orderNumber = 0;
    //设置机器id
    public static function setMachineId($mId = 0)
    {
        self::$machineId = $mId;
    }
    //获取机器id
    public static function getMachineId()
    {
        return self::$machineId;
    }
    //生成id

    public static function createOnlyId($needOrder = true, $mId = 0)
    {
        // 时间戳 42字节
        $time = floor(microtime(true) * 1000);
        // 当前时间 与 开始时间 差值
        $time -= self::EPOCH;
        // 二进制的 毫秒级时间戳
        $base = decbin(self::max41bit + $time);
        // 机器id  10 字节

        if(!self::$machineId)
        {
            self::$machineId = config(self::MACHINEID);
        }

        if($mId)
            $machineNumberId = $mId;
        else
            $machineNumberId = self::$machineId;


        $machineid = str_pad(decbin($machineNumberId), 10, "0", STR_PAD_LEFT);

        $randNumber = 0;
        if($needOrder) {
            self::$orderNumber = self::$orderNumber < self::max12bit? self::$orderNumber + 1 : 0;
            $randNumber = self::$orderNumber;
        }else{
            self::$orderNumber = 0;
            $randNumber = mt_rand(0, self::max12bit);
        }

        // 序列数 12字节
        $random = str_pad(decbin($randNumber), 12, "0", STR_PAD_LEFT);
        // 拼接
        $base = $base.$machineid.$random;
        // 转化为 十进制 返回
        return bindec($base);
    }
}


神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。