php雪花算法實現


<?php
/**
 *  分布式 id 生成類     組成: <毫秒級時間戳+機器id+序列號>
 *  默認情況下41bit的時間戳可以支持該算法使用到2082年,10bit的工作機器id可以支持1023台機器,序列號支持1毫秒產生4095個自增序列id
 *  @author zhangqi
 */
class IdCreate
{
    const EPOCH = 1479533469598;    //開始時間,固定一個小於當前時間的毫秒數
    const max12bit = 4095;
    const max41bit = 1099511627775;

    static $machineId = null;      // 機器id

    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);
        }
        // 序列數 12字節
        $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);
        // 拼接
        $base = $base.$machineid.$random;
        // 轉化為 十進制 返回
        return bindec($base);
    }
}
IdCreate::machineId("1");//機器編號
echo IdCreate::createOnlyId();//分布式id
?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM