<?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);
}
}
神回复
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。