<?php
class Idcreate {
const EPOCH = 0;
//开始时间,固定一个小于当前时间的毫秒数
const max12bit = 1024;
const max41bit = 1099511627888;
static $machineId = null;
public static function machineId($mId = 0) {
self::$machineId = $mId;
}
public static function createOnlyId() {
// 时间戳 42字节
$time = floor(microtime(true) * 1000);
// 当前时间 与 开始时间 差值
$time -= self::EPOCH;
// 二进制的 毫秒级时间戳
$base = decbin(self::max41bit + $time);
// 机器id 10 字节
if(!self ::$machineId) {
$machineid = self ::$machineId;
} else {
$machineid = str_pad(decbin(self ::$machineId),10,"0",STR_PAD_LEFT);
}
$random = str_pad(decbin(mt_rand(0,self::max12bit)),12,"0",STR_PAD_LEFT);
// 拼接
$base = $base . $machineid . $random;
// 转化为 十进制 返回
return bindec($base);
}
}
$obj = new Idcreate;
for ($i=0; $i <100 ; $i++) {
echo $obj->createOnlyId()."<br>";
}