1. 程式人生 > 實用技巧 >【演算法】利用雪花演算法生成分散式唯一ID

【演算法】利用雪花演算法生成分散式唯一ID

上程式碼

<?php
/**
 *  分散式 id 生成類     組成: <毫秒級時間戳+機器id+序列號>
 *  預設情況下41bit的時間戳可以支援該演算法使用到2082年,10bit的工作機器id可以支援1023臺機器,序列號支援1毫秒產生4095個自增序列id
 *  @author zhangqi
 */
class IdCreate
{
    const EPOCH = 1606892626000;    //開始時間,固定一個小於當前時間的毫秒數
    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
?>