php 雪花算法

<?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>";
}

 

posted @ 2020-07-09 16:12  酷酷的城池  阅读(476)  评论(0编辑  收藏  举报