php 生成雪花算法
<?php
class IdGenerator
{
const EPOCH = 1479533469598; // 自定义起始时间
const max12bit = 4095; // 随机序列号的最大值
const max41bit = 1099511627775; // 时间戳的最大值
static $machineId = null; // 静态变量,用来存储机器ID
public static function machineId($mId = 0) { // 设定机器ID的方法
self::$machineId = $mId;
}
public static function generateParticle() { // 生成唯一id的方法
$time = floor(microtime(true) * 1000); // 获取当前的毫秒级时间戳
$time -= self::EPOCH; // 减去我们设定的起始时间,得到差值
$base = decbin(self::max41bit + $time); // 加上时间戳的最大值并转为二进制
if(!self::$machineId) {
$machineid = self::$machineId;
} else {
$machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);
}// 判定机器ID是否存在,存在则转为二进制并补齐十位
$random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);// 随机生成 12 位序列号
$base = $base.$machineid.$random; // 三段拼接成一个二进制字符串
return bindec($base); // 将二进制转为十进制
}
}
IdGenerator::machineId(1); // 设置机器ID为 1
var_dump(IdGenerator::generateParticle()); // 生成雪花ID
IdGenerator::machineId(3); // 设置机器ID为 3
for ($i=0;$i<=10;$i++) {
var_dump(IdGenerator::generateParticle()); // 生成雪花ID
}