不同AI生成的PHP版雪花算法

php写一个雪花算法 【代码】php写一个雪花算法。 阅读详情

OpenAI

<?php
/**
 * Snowflake 雪花算法生成器
 * 生成的 64 位 ID 结构:
 *  1 位    保留位(始终为0,防止负数)
 *  41 位   时间戳(毫秒级,当前时间减去自定义纪元)
 *  5 位    数据中心ID
 *  5 位    机器ID
 *  12 位   序列号(同一毫秒内生成多个 ID)
 */
class Snowflake
{
    // 自定义纪元(起始时间戳),可根据实际情况调整
    private $twepoch = 1288834974657;

    // 各部分占用的位数
    private $workerIdBits     = 5;   // 机器ID位数
    private $datacenterIdBits = 5;   // 数据中心ID位数
    private $sequenceBits     = 12;  // 序列号位数

    // 各部分的最大数值(通过位运算计算)
    private $maxWorkerId;
    private $maxDatacenterId;
    private $sequenceMask;

    // 各部分左移位数
    private $workerIdShift;
    private $datacenterIdShift;
    private $timestampLeftShift;

    // 工作机器ID和数据中心ID(取值范围 0 ~ 最大值)
    private $workerId;
    private $datacenterId;

    // 序列号,记录同一毫秒内生成的ID序号
    private $sequence = 0;

    // 上一次生成ID的时间戳,初始化为 -1
    private $lastTimestamp = -1;

    /**
     * 构造函数
     *
     * @param int $workerId      机器ID(0 ~ 31)
     * @param int $datacenterId  数据中心ID(0 ~ 31)
     */
    public function __construct($workerId, $datacenterId)
    {
        // 计算各部分最大值:如 -1 << 5 得到 0b11111 (31)
        $this->maxWorkerId     = -1 ^ (-1 << $this->workerIdBits);
        $this->maxDatacenterId = -1 ^ (-1 << $this->datacenterIdBits);
        // 序列号最大值(4095:12位全1)
        $this->sequenceMask    = -1 ^ (-1 << $this->sequenceBits);

        // 检查传入的机器ID和数据中心ID是否合法
        if ($workerId > $this->maxWorkerId || $workerId < 0) {
            throw new Exception("机器ID必须在 0 到 " . $this->maxWorkerId . " 之间");
        }
        if ($datacenterId > $this->maxDatacenterId || $datacenterId < 0) {
            throw new Exception("数据中心ID必须在 0 到 " . $this->maxDatacenterId . " 之间");
        }
        $this->workerId     = $workerId;
        $this->datacenterId = $datacenterId;

        // 计算各部分需要左移的位数
        // 序列号占用 12 位,因此机器ID需要左移 12 位
        $this->workerIdShift     = $this->sequenceBits;
        // 数据中心ID需要左移 12 + 5 = 17 位
        $this->datacenterIdShift = $this->sequenceBits + $this->workerIdBits;
        // 时间戳需要左移 12 + 5 + 5 = 22 位
        $this->timestampLeftShift = $this->sequenceBits + $this->workerIdBits + $this->datacenterIdBits;
    }

    /**
     * 生成下一个唯一ID
     *
     * @return int 64位的唯一ID
     */
    public function nextId()
    {
        // 获取当前毫秒级时间戳
        $timestamp = $this->timeGen();

        // 如果当前时间小于上一次生成ID的时间戳,则说明系统时钟回拨,无法生成ID
        if ($timestamp < $this->lastTimestamp) {
            throw new Exception("时钟回拨异常,拒绝生成ID. 差值: " . ($this->lastTimestamp - $timestamp) . " 毫秒");
        }

        // 如果当前时间与上次生成ID时间相同,表示同一毫秒内生成多个ID
        if ($timestamp == $this->lastTimestamp) {
            // 序列号自增,并通过位运算确保在 12 位内(最大值为 4095)
            $this->sequence = ($this->sequence + 1) & $this->sequenceMask;
            // 如果序列号达到最大值,则等待下一毫秒
            if ($this->sequence == 0) {
                $timestamp = $this->tilNextMillis($this->lastTimestamp);
            }
        } else {
            // 不同毫秒内,序列号重置为 0
            $this->sequence = 0;
        }

        // 更新上一次生成ID的时间戳
        $this->lastTimestamp = $timestamp;

        /**
         * 拼接各部分生成最终ID:
         * 1. (当前时间戳 - 自定义纪元) 左移 TIMESTAMP_LEFT_SHIFT 位
         * 2. 数据中心ID左移 DATACENTER_ID_SHIFT 位
         * 3. 机器ID左移 WORKER_ID_SHIFT 位
         * 4. 序列号(低12位)
         * 最终通过按位或(|)运算组合成一个 64 位的整数
         */
        $id = (($timestamp - $this->twepoch) << $this->timestampLeftShift)
            | ($this->datacenterId << $this->datacenterIdShift)
            | ($this->workerId << $this->workerIdShift)
            | $this->sequence;

        return $id;
    }

    /**
     * 等待直到下一毫秒
     *
     * @param int $lastTimestamp 上次生成ID的时间戳
     * @return int 下一毫秒的时间戳
     */
    private function tilNextMillis($lastTimestamp)
    {
        $timestamp = $this->timeGen();
        // 循环等待直到时间戳发生变化(进入下一毫秒)
        while ($timestamp <= $lastTimestamp) {
            $timestamp = $this->timeGen();
        }
        return $timestamp;
    }

    /**
     * 获取当前时间戳(毫秒级)
     *
     * @return int 当前毫秒级时间戳
     */
    private function timeGen()
    {
        // microtime(true) 返回秒为单位的小数,将其乘以 1000 转换为毫秒
        return (int) (microtime(true) * 1000);
    }
}

// ------------------------- 测试示例 ------------------------- //

// 创建一个 Snowflake 实例,指定机器ID和数据中心ID
try {
    $snowflake = new Snowflake(1, 1);

    // 生成 10 个唯一ID,并输出
    for ($i = 0; $i < 10; $i++) {
        echo "生成的ID " . ($i + 1) . " : " . $snowflake->nextId() . "\n";
    }
} catch (Exception $e) {
    echo "异常:" . $e->getMessage();
}
?>

DeepSeek

<?php

/**
 * 雪花算法分布式ID生成器
 * 结构:0 | 时间戳(41位) | 数据中心ID(5位) | 机器ID(5位) | 序列号(12位)
 */
class Snowflake
{
    // 起始时间戳(2024-01-01 00:00:00 UTC)
    const EPOCH = 1704067200000;
    
    // 位数分配
    const SEQUENCE_BITS = 12;   // 序列号位数
    const MACHINE_BITS = 5;     // 机器标识位数
    const DATACENTER_BITS = 5;  // 数据中心位数

    // 最大值计算(位运算优化)
    const MAX_SEQUENCE = -1 ^ (-1 << self::SEQUENCE_BITS);
    const MAX_MACHINE = -1 ^ (-1 << self::MACHINE_BITS);
    const MAX_DATACENTER = -1 ^ (-1 << self::DATACENTER_BITS);

    // 移位偏移量计算
    const TIMESTAMP_SHIFT = self::SEQUENCE_BITS + self::MACHINE_BITS + self::DATACENTER_BITS;
    const DATACENTER_SHIFT = self::SEQUENCE_BITS + self::MACHINE_BITS;
    const MACHINE_SHIFT = self::SEQUENCE_BITS;

    private $machineId;      // 机器标识ID
    private $datacenterId;   // 数据中心ID
    private $sequence = 0;   // 序列号
    private $lastTimestamp = -1; // 上次生成时间戳

    /**
     * 构造函数
     * @param int $machineId    机器ID (0~31)
     * @param int $datacenterId 数据中心ID (0~31)
     */
    public function __construct($machineId, $datacenterId)
    {
        // 参数校验
        if ($machineId > self::MAX_MACHINE || $machineId < 0) {
            throw new InvalidArgumentException("机器ID值超出范围(0~".self::MAX_MACHINE.")");
        }
        if ($datacenterId > self::MAX_DATACENTER || $datacenterId < 0) {
            throw new InvalidArgumentException("数据中心ID值超出范围(0~".self::MAX_DATACENTER.")");
        }
        
        $this->machineId = $machineId;
        $this->datacenterId = $datacenterId;
    }

    /**
     * 生成下一个分布式ID
     * @return int 64位整型ID(PHP中实际返回字符串类型以保证精度)
     */
    public function generateId()
    {
        $timestamp = $this->getCurrentTimestamp();

        // 时钟回拨检查
        if ($timestamp < $this->lastTimestamp) {
            $diff = $this->lastTimestamp - $timestamp;
            throw new RuntimeException("系统时钟回拨 {$diff} 毫秒");
        }

        // 同一毫秒内生成
        if ($this->lastTimestamp == $timestamp) {
            $this->sequence = ($this->sequence + 1) & self::MAX_SEQUENCE;
            
            // 序列号耗尽,等待下一毫秒
            if ($this->sequence == 0) {
                $timestamp = $this->waitNextMillis($this->lastTimestamp);
            }
        } else {
            // 新时间戳重置序列号
            $this->sequence = 0;
        }

        $this->lastTimestamp = $timestamp;

        // 组合各部分数据
        $id = (($timestamp) << self::TIMESTAMP_SHIFT)
            | ($this->datacenterId << self::DATACENTER_SHIFT)
            | ($this->machineId << self::MACHINE_SHIFT)
            | $this->sequence;

        // 返回字符串类型以避免32位系统精度丢失
        return (string)$id;
    }

    /**
     * 阻塞到下一毫秒
     * @param int $lastTimestamp 上次生成时间戳
     * @return int 当前时间戳
     */
    private function waitNextMillis($lastTimestamp)
    {
        $timestamp = $this->getCurrentTimestamp();
        while ($timestamp <= $lastTimestamp) {
            usleep(1000); // 休眠1毫秒
            $timestamp = $this->getCurrentTimestamp();
        }
        return $timestamp;
    }

    /**
     * 获取当前时间戳(毫秒)
     * @return int 毫秒时间戳
     */
    private function getCurrentTimestamp()
    {
        return round(microtime(true) * 1000) - self::EPOCH;
    }
}

/* 使用示例 */
try {
    $snowflake = new Snowflake(1, 1); // 机器ID=1,数据中心ID=1
    
    // 生成10个ID
    for ($i = 0; $i < 10; $i++) {
        echo $snowflake->generateId() . PHP_EOL;
    }
} catch (Exception $e) {
    echo $e->getMessage();
}

Kimi

<?php

/**
 * 雪花算法生成唯一ID
 * 基于Twitter的Snowflake算法,生成一个64位的唯一ID
 */
class Snowflake
{
    // 以下是各个部分所占的位数
    const SIGN_BIT = 1; // 符号位,始终为0
    const TIMESTAMP_BIT = 41; // 时间戳位数
    const DATA_CENTER_ID_BIT = 5; // 数据中心ID位数
    const WORKER_ID_BIT = 5; // 机器节点ID位数
    const SEQUENCE_BIT = 12; // 序列号位数

    // 最大值
    const MAX_DATA_CENTER_ID = -1 ^ (-1 << self::DATA_CENTER_ID_BIT); // 31
    const MAX_WORKER_ID = -1 ^ (-1 << self::WORKER_ID_BIT); // 31
    const MAX_SEQUENCE = -1 ^ (-1 << self::SEQUENCE_BIT); // 4095

    // 每一部分的偏移量
    const DATA_CENTER_ID_SHIFT = self::SEQUENCE_BIT;
    const WORKER_ID_SHIFT = self::SEQUENCE_BIT + self::DATA_CENTER_ID_BIT;
    const TIMESTAMP_SHIFT = self::SEQUENCE_BIT + self::DATA_CENTER_ID_BIT + self::WORKER_ID_BIT;

    // 开始时间戳(2023-01-01 00:00:00的毫秒数)
    const EPOCH = 1672502400000;

    // 数据中心ID和机器节点ID
    private $dataCenterId;
    private $workerId;

    // 序列号
    private $sequence = 0;

    // 上一次的时间戳
    private $lastTimestamp = -1;

    /**
     * 构造函数
     * @param int $dataCenterId 数据中心ID
     * @param int $workerId 机器节点ID
     */
    public function __construct($dataCenterId = 0, $workerId = 0)
    {
        if ($dataCenterId > self::MAX_DATA_CENTER_ID || $dataCenterId < 0) {
            throw new \InvalidArgumentException("dataCenterId不能大于" . self::MAX_DATA_CENTER_ID . "或小于0");
        }
        if ($workerId > self::MAX_WORKER_ID || $workerId < 0) {
            throw new \InvalidArgumentException("workerId不能大于" . self::MAX_WORKER_ID . "或小于0");
        }
        $this->dataCenterId = $dataCenterId;
        $this->workerId = $workerId;
    }

    /**
     * 生成唯一ID
     * @return int 唯一ID
     */
    public function generateId()
    {
        $currentTimestamp = $this->getCurrentTimestamp();
        if ($currentTimestamp < $this->lastTimestamp) {
            throw new \RuntimeException("时间戳回退,拒绝生成ID");
        }

        if ($currentTimestamp == $this->lastTimestamp) {
            $this->sequence = ($this->sequence + 1) & self::MAX_SEQUENCE;
            if ($this->sequence == 0) {
                $currentTimestamp = $this->tilNextMillis($this->lastTimestamp);
            }
        } else {
            $this->sequence = 0;
        }

        $this->lastTimestamp = $currentTimestamp;

        // ID拼接
        $id = (($currentTimestamp - self::EPOCH) << self::TIMESTAMP_SHIFT)
            | ($this->dataCenterId << self::DATA_CENTER_ID_SHIFT)
            | ($this->workerId << self::WORKER_ID_SHIFT)
            | $this->sequence;

        return $id;
    }

    /**
     * 等待下一毫秒
     * @param int $lastTimestamp 上一次的时间戳
     * @return int 当前时间戳
     */
    private function tilNextMillis($lastTimestamp)
    {
        $timestamp = $this->getCurrentTimestamp();
        while ($timestamp <= $lastTimestamp) {
            $timestamp = $this->getCurrentTimestamp();
        }
        return $timestamp;
    }

    /**
     * 获取当前时间戳(毫秒)
     * @return int 当前时间戳
     */
    private function getCurrentTimestamp()
    {
        return round(microtime(true) * 1000);
    }
}

// 使用示例
$snowflake = new Snowflake(1, 2); // 数据中心ID为1,机器节点ID为2
$id = $snowflake->generateId();
echo $id;

智谱清言

<?php

/**
 * Snowflake ID生成类,基于Twitter的Snowflake算法
 */
class Snowflake {
    // 雪花算法常量定义
    const EPOCH = 1288834974657; // 起始时间戳,单位毫秒
    const DATA_CENTER_ID_BITS = 5; // 数据中心ID所占的位数
    const MACHINE_ID_BITS = 5; // 机器ID所占的位数
    const SEQUENCE_BITS = 12; // 序列号所占的位数

    const MAX_DATA_CENTER_ID = (1 << self::DATA_CENTER_ID_BITS) - 1; // 最大的数据中心ID
    const MAX_MACHINE_ID = (1 << self::MACHINE_ID_BITS) - 1; // 最大的机器ID
    const MAX_SEQUENCE = (1 << self::SEQUENCE_BITS) - 1; // 最大的序列号

    const MACHINE_ID_SHIFT = self::SEQUENCE_BITS; // 机器ID的偏移量
    const DATA_CENTER_ID_SHIFT = self::MACHINE_ID_SHIFT + self::MACHINE_ID_BITS; // 数据中心ID的偏移量
    const TIMESTAMP_SHIFT = self::DATA_CENTER_ID_SHIFT + self::DATA_CENTER_ID_BITS; // 时间戳的偏移量

    private $dataCenterId; // 数据中心ID
    private $machineId; // 机器ID
    private $sequence = 0; // 序列号
    private $lastTimestamp = -1; // 上一次生成ID的时间戳

    /**
     * 构造函数
     * @param int $dataCenterId 数据中心ID,范围0到31
     * @param int $machineId 机器ID,范围0到31
     */
    public function __construct($dataCenterId,$machineId) {
        if ($dataCenterId < 0 ||$dataCenterId > self::MAX_DATA_CENTER_ID) {
            throw new InvalidArgumentException("数据中心ID必须在0和" . self::MAX_DATA_CENTER_ID . "之间");
        }
        if ($machineId < 0 ||$machineId > self::MAX_MACHINE_ID) {
            throw new InvalidArgumentException("机器ID必须在0和" . self::MAX_MACHINE_ID . "之间");
        }
        $this->dataCenterId =$dataCenterId;
        $this->machineId =$machineId;
    }

    /**
     * 生成下一个ID
     * @return string 生成的ID字符串
     */
    public function nextId() {
        $timestamp =$this->timeGen();

        // 如果当前时间戳小于上一次的时间戳,说明时钟回拨
        if ($timestamp <$this->lastTimestamp) {
            throw new RuntimeException("时钟回拨,拒绝生成ID");
        }

        // 如果当前时间戳与上一次的时间戳相同,同一毫秒内生成多个ID
        if ($timestamp ==$this->lastTimestamp) {
            $this->sequence = ($this->sequence + 1) & self::MAX_SEQUENCE;
            // 如果序列号达到最大值,等待下一毫秒
            if ($this->sequence == 0) {
                $timestamp =$this->tilNextMillis($this->lastTimestamp);
            }
        } else {
            // 如果进入新的毫秒,序列号重置为0
            $this->sequence = 0;
        }

        // 更新上一次的时间戳
        $this->lastTimestamp =$timestamp;

        // 生成ID
        $id = (($timestamp - self::EPOCH) << self::TIMESTAMP_SHIFT) |
              ($this->dataCenterId << self::DATA_CENTER_ID_SHIFT) |
              ($this->machineId << self::MACHINE_ID_SHIFT) |
              $this->sequence;

        return strval($id);
    }

    /**
     * 获取当前时间戳,单位毫秒
     * @return int
     */
    private function timeGen() {
        return floor(microtime(true) * 1000);
    }

    /**
     * 等待下一毫秒,直到时间戳增加
     * @param int $lastTimestamp 上一次的时间戳
     * @return int 当前时间戳
     */
    private function tilNextMillis($lastTimestamp) {
        $timestamp =$this->timeGen();
        while ($timestamp <=$lastTimestamp) {
            $timestamp =$this->timeGen();
        }
        return $timestamp;
    }
}

// 使用示例
try {
    // 创建Snowflake实例,数据中心ID为1,机器ID为1
    $snowflake = new Snowflake(1, 1);

    // 生成并输出10个唯一ID
    for ($i = 0;$i < 10; $i++) {
        $id =$snowflake->nextId();
        echo $id . "\n";
    }

    // 创建另一个Snowflake实例,数据中心ID为1,机器ID为2
    $snowflake2 = new Snowflake(1, 2);

    // 生成并输出10个唯一ID
    for ($i = 0;$i < 10; $i++) {
        $id =$snowflake2->nextId();
        echo $id . "\n";
    }

    // 创建另一个Snowflake实例,数据中心ID为2,机器ID为1
    $snowflake3 = new Snowflake(2, 1);

    // 生成并输出10个唯一ID
    for ($i = 0;$i < 10; $i++) {
        $id =$snowflake3->nextId();
        echo $id . "\n";
    }
} catch (Exception $e) {
    echo "错误: " . $e->getMessage() . "\n";
}

Claude

<?php

/**
 * 雪花算法(Snowflake)PHP实现
 * 
 * 雪花算法是由Twitter开发的分布式ID生成算法,能够在分布式系统中产生唯一的ID
 * 该算法生成的ID结构为64位长整型,由以下部分组成:
 * 1. 1位符号位,固定为0(表示正数)
 * 2. 41位时间戳(毫秒级),可使用约69年
 * 3. 10位工作机器ID,包括5位数据中心ID和5位机器ID,最多支持32个数据中心和每个中心下32台机器
 * 4. 12位序列号,1毫秒内最多生成4096个ID
 */
class Snowflake {
    /**
     * 开始时间戳(2020-01-01)
     * 这是算法的基准时间,用于计算相对时间戳
     */
    const START_TIMESTAMP = 1577808000000; // 2020-01-01 00:00:00 GMT
    
    /**
     * 各部分占用的位数
     */
    const SEQUENCE_BITS = 12;       // 序列号占用的位数
    const MACHINE_ID_BITS = 5;      // 机器ID占用的位数
    const DATACENTER_ID_BITS = 5;   // 数据中心ID占用的位数
    
    /**
     * 各部分的最大值
     */
    const MAX_SEQUENCE = -1 ^ (-1 << self::SEQUENCE_BITS);          // 序列号最大值 4095
    const MAX_MACHINE_ID = -1 ^ (-1 << self::MACHINE_ID_BITS);      // 机器ID最大值 31
    const MAX_DATACENTER_ID = -1 ^ (-1 << self::DATACENTER_ID_BITS);// 数据中心ID最大值 31
    
    /**
     * 各部分向左的位移
     */
    const MACHINE_ID_SHIFT = self::SEQUENCE_BITS;                                   // 机器ID向左移12位
    const DATACENTER_ID_SHIFT = self::SEQUENCE_BITS + self::MACHINE_ID_BITS;        // 数据中心ID向左移17位
    const TIMESTAMP_SHIFT = self::SEQUENCE_BITS + self::MACHINE_ID_BITS + self::DATACENTER_ID_BITS; // 时间戳向左移22位
    
    /**
     * 数据中心ID
     * @var int
     */
    private $datacenterId;
    
    /**
     * 机器ID
     * @var int
     */
    private $machineId;
    
    /**
     * 毫秒内序列号
     * @var int
     */
    private $sequence = 0;
    
    /**
     * 上次生成ID的时间戳
     * @var int
     */
    private $lastTimestamp = -1;
    
    /**
     * 构造函数
     * 
     * @param int $datacenterId 数据中心ID (0~31)
     * @param int $machineId 机器ID (0~31)
     * @throws Exception 当数据中心ID或机器ID超出范围时抛出异常
     */
    public function __construct($datacenterId, $machineId) {
        // 参数校验
        if ($datacenterId > self::MAX_DATACENTER_ID || $datacenterId < 0) {
            throw new Exception("数据中心ID不能大于".self::MAX_DATACENTER_ID."或小于0");
        }
        
        if ($machineId > self::MAX_MACHINE_ID || $machineId < 0) {
            throw new Exception("机器ID不能大于".self::MAX_MACHINE_ID."或小于0");
        }
        
        $this->datacenterId = $datacenterId;
        $this->machineId = $machineId;
    }
    
    /**
     * 获取当前时间戳(毫秒)
     * 
     * @return int 当前时间戳(毫秒)
     */
    private function getCurrentTimestamp() {
        // 获取当前时间戳,单位为毫秒
        return floor(microtime(true) * 1000);
    }
    
    /**
     * 阻塞到下一个毫秒,直到获得新的时间戳
     * 
     * @param int $lastTimestamp 上次生成ID的时间戳
     * @return int 新的时间戳
     */
    private function waitNextMillis($lastTimestamp) {
        $timestamp = $this->getCurrentTimestamp();
        while ($timestamp <= $lastTimestamp) {
            $timestamp = $this->getCurrentTimestamp();
        }
        return $timestamp;
    }
    
    /**
     * 生成ID
     * 
     * @return string 返回生成的ID(字符串形式,因为PHP整数范围有限)
     * @throws Exception 当时钟回拨时抛出异常
     */
    public function nextId() {
        // 获取当前时间戳
        $timestamp = $this->getCurrentTimestamp();
        
        // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过,抛出异常
        if ($timestamp < $this->lastTimestamp) {
            throw new Exception("时钟向后移动,拒绝生成ID,时间差: " . ($this->lastTimestamp - $timestamp) . " 毫秒");
        }
        
        // 如果是同一时间生成的,则进行毫秒内序列号递增
        if ($timestamp == $this->lastTimestamp) {
            // 序列号递增
            $this->sequence = ($this->sequence + 1) & self::MAX_SEQUENCE;
            // 同一毫秒内序列号已经达到最大值,阻塞到下一个毫秒
            if ($this->sequence == 0) {
                $timestamp = $this->waitNextMillis($this->lastTimestamp);
            }
        } else {
            // 时间戳改变,毫秒内序列号重置为0
            $this->sequence = 0;
        }
        
        // 记录上次生成ID的时间戳
        $this->lastTimestamp = $timestamp;
        
        // 计算相对时间戳(与起始时间的差值)
        $relativeTimestamp = $timestamp - self::START_TIMESTAMP;
        
        // 组装ID并返回
        // 使用字符串拼接,避免PHP整数溢出问题
        $id = (($relativeTimestamp << self::TIMESTAMP_SHIFT) |
               ($this->datacenterId << self::DATACENTER_ID_SHIFT) |
               ($this->machineId << self::MACHINE_ID_SHIFT) |
               $this->sequence);
        
        // 转换为字符串,避免潜在的整数溢出问题
        return (string)$id;
    }
}

// 使用示例
try {
    // 创建一个雪花算法实例,参数为数据中心ID和机器ID
    $snowflake = new Snowflake(1, 1);
    
    // 生成ID
    $id = $snowflake->nextId();
    echo "生成的ID: " . $id . PHP_EOL;
    
    // 批量生成多个ID
    echo "批量生成5个ID:" . PHP_EOL;
    for ($i = 0; $i < 5; $i++) {
        echo $snowflake->nextId() . PHP_EOL;
    }
} catch (Exception $e) {
    echo "错误: " . $e->getMessage() . PHP_EOL;
}
?>

豆包

<?php

class Snowflake {
    // 起始时间戳,一般设置为项目开始的时间,单位:毫秒
    const EPOCH = 1609459200000; 

    // 数据中心 ID 所占的位数
    const DATA_CENTER_ID_BITS = 5; 
    // 机器 ID 所占的位数
    const WORKER_ID_BITS = 5; 
    // 序列号所占的位数
    const SEQUENCE_BITS = 12; 

    // 数据中心 ID 最大值
    const MAX_DATA_CENTER_ID = -1 ^ (-1 << self::DATA_CENTER_ID_BITS); 
    // 机器 ID 最大值
    const MAX_WORKER_ID = -1 ^ (-1 << self::WORKER_ID_BITS); 
    // 序列号最大值
    const MAX_SEQUENCE = -1 ^ (-1 << self::SEQUENCE_BITS); 

    // 机器 ID 向左移位数
    const WORKER_ID_SHIFT = self::SEQUENCE_BITS; 
    // 数据中心 ID 向左移位数
    const DATA_CENTER_ID_SHIFT = self::SEQUENCE_BITS + self::WORKER_ID_BITS; 
    // 时间戳向左移位数
    const TIMESTAMP_LEFT_SHIFT = self::SEQUENCE_BITS + self::WORKER_ID_BITS + self::DATA_CENTER_ID_BITS; 

    // 数据中心 ID
    private $dataCenterId; 
    // 机器 ID
    private $workerId; 
    // 序列号
    private $sequence = 0; 
    // 上一次生成 ID 的时间戳
    private $lastTimestamp = -1; 

    /**
     * 构造函数,初始化数据中心 ID 和机器 ID
     *
     * @param int $dataCenterId 数据中心 ID
     * @param int $workerId 机器 ID
     * @throws Exception 如果数据中心 ID 或机器 ID 超出范围,抛出异常
     */
    public function __construct($dataCenterId, $workerId) {
        // 检查数据中心 ID 是否在合法范围内
        if ($dataCenterId > self::MAX_DATA_CENTER_ID || $dataCenterId < 0) {
            throw new Exception("Data center ID must be between 0 and " . self::MAX_DATA_CENTER_ID);
        }
        // 检查机器 ID 是否在合法范围内
        if ($workerId > self::MAX_WORKER_ID || $workerId < 0) {
            throw new Exception("Worker ID must be between 0 and " . self::MAX_WORKER_ID);
        }

        $this->dataCenterId = $dataCenterId;
        $this->workerId = $workerId;
    }

    /**
     * 生成下一个唯一的 ID
     *
     * @return int 生成的唯一 ID
     * @throws Exception 如果系统时钟回拨,抛出异常
     */
    public function nextId() {
        // 获取当前时间戳,单位:毫秒
        $timestamp = $this->getCurrentTimestamp();

        // 处理时钟回拨问题
        if ($timestamp < $this->lastTimestamp) {
            throw new Exception("Clock moved backwards. Refusing to generate id for " . ($this->lastTimestamp - $timestamp) . " milliseconds");
        }

        if ($timestamp == $this->lastTimestamp) {
            // 如果在同一毫秒内,序列号递增
            $this->sequence = ($this->sequence + 1) & self::MAX_SEQUENCE;
            if ($this->sequence == 0) {
                // 序列号达到最大值,等待下一毫秒
                $timestamp = $this->waitNextMillis($this->lastTimestamp);
            }
        } else {
            // 时间戳改变,重置序列号
            $this->sequence = 0;
        }

        // 更新上一次生成 ID 的时间戳
        $this->lastTimestamp = $timestamp;

        // 生成最终的 ID
        return (($timestamp - self::EPOCH) << self::TIMESTAMP_LEFT_SHIFT) |
            ($this->dataCenterId << self::DATA_CENTER_ID_SHIFT) |
            ($this->workerId << self::WORKER_ID_SHIFT) |
            $this->sequence;
    }

    /**
     * 获取当前时间戳,单位:毫秒
     *
     * @return int 当前时间戳
     */
    private function getCurrentTimestamp() {
        return floor(microtime(true) * 1000);
    }

    /**
     * 等待下一毫秒
     *
     * @param int $lastTimestamp 上一次生成 ID 的时间戳
     * @return int 下一毫秒的时间戳
     */
    private function waitNextMillis($lastTimestamp) {
        $timestamp = $this->getCurrentTimestamp();
        while ($timestamp <= $lastTimestamp) {
            $timestamp = $this->getCurrentTimestamp();
        }
        return $timestamp;
    }
}

// 使用示例
try {
    // 创建 Snowflake 实例,指定数据中心 ID 和机器 ID
    $snowflake = new Snowflake(1, 1);
    // 生成唯一 ID
    $id = $snowflake->nextId();
    echo "Generated ID: " . $id;
} catch (Exception $e) {
    echo "Error: " . $e->getMessage();
}

腾讯元宝

<?php
class Snowflake
{
    // 数据中心ID所占位数(5位,支持32个数据中心)
    const DATA_CENTER_ID_BITS = 5;
    // 机器ID所占位数(5位,支持32台机器)
    const MACHINE_ID_BITS = 5;
    // 序列号所占位数(12位,每毫秒支持4096个ID)
    const SEQUENCE_BITS = 12;

    // 最大数据中心ID(2^5 - 1)
    const MAX_DATA_CENTER_ID = -1 ^ (-1 << self::DATA_CENTER_ID_BITS);
    // 最大机器ID(2^5 - 1)
    const MAX_MACHINE_ID = -1 ^ (-1 << self::MACHINE_ID_BITS);

    // 时间戳左移位数(41+5+5=51位)
    const TIMESTAMP_LEFT_SHIFT = self::SEQUENCE_BITS + self::MACHINE_ID_BITS + self::DATA_CENTER_ID_BITS;
    // 机器ID左移位数(41+5=46位)
    const SEQUENCE_LEFT_SHIFT = self::MACHINE_ID_BITS + self::DATA_CENTER_ID_BITS;

    // 起始时间戳(2021-01-01 00:00:00,可自定义)
    private $epoch = 1609430400000;

    // 实例属性
    private int $datacenterId;    // 数据中心ID
    private int $machineId;       // 机器ID
    private int $sequence = 0;     // 序列号
    private int $lastTimestamp = -1; // 上次生成ID的时间戳

    /**
     * 构造函数,初始化ID生成器
     * @param int $datacenterId 数据中心ID(0-31)
     * @param int $machineId 机器ID(0-31)
     * @throws Exception 如果ID超出范围
     */
    public function __construct(int $datacenterId, int $machineId)
    {
        // 验证数据中心ID范围
        if ($datacenterId < 0 || $datacenterId > self::MAX_DATA_CENTER_ID) {
            throw new Exception("数据中心ID超出范围");
        }
        // 验证机器ID范围
        if ($machineId < 0 || $machineId > self::MAX_MACHINE_ID) {
            throw new Exception("机器ID超出范围");
        }
        $this->datacenterId = $datacenterId;
        $this->machineId = $machineId;
    }

    /**
     * 生成唯一ID
     * @return int 64位唯一ID
     * @throws Exception 如果时钟发生回拨
     */
    public function nextId(): int
    {
        $timestamp = $this->currentTimeMillis();

        // 检测时钟回拨
        if ($timestamp < $this->lastTimestamp) {
            throw new Exception("错误:系统时钟发生回拨");
        }

        // 同一毫秒内处理序列号递增
        if ($this->lastTimestamp === $timestamp) {
            $this->sequence = ($this->sequence + 1) & ((1 << self::SEQUENCE_BITS) - 1);
            // 序列号溢出,等待下一毫秒
            if ($this->sequence === 0) {
                $timestamp = $this->waitNextMillis($timestamp);
            }
        } else {
            // 新的一毫秒,重置序列号
            $this->sequence = 0;
        }

        // 更新上次时间戳
        $this->lastTimestamp = $timestamp;

        // 组合ID:(时间戳 << 22) | (数据中心ID << 17) | (机器ID << 12) | 序列号
        return (($timestamp - $this->epoch) << self::TIMESTAMP_LEFT_SHIFT) |
               ($this->datacenterId << self::SEQUENCE_LEFT_SHIFT) |
               ($this->machineId << self::SEQUENCE_BITS) |
               $this->sequence;
    }

    /**
     * 等待下一毫秒
     * @param int $lastTimestamp 上次时间戳
     * @return int 下一毫秒时间戳
     */
    private function waitNextMillis(int $lastTimestamp): int
    {
        $timestamp = $this->currentTimeMillis();
        while ($timestamp <= $lastTimestamp) {
            $timestamp = $this->currentTimeMillis();
        }
        return $timestamp;
    }

    /**
     * 获取当前时间戳(毫秒级)
     * @return int
     */
    private function currentTimeMillis(): int
    {
        return (int)(microtime(true) * 1000);
    }
}

// 使用示例
$datacenterId = 1;    // 数据中心ID(0-31)
$machineId = 1;       // 机器ID(0-31)
$snowflake = new Snowflake($datacenterId, $machineId);

for ($i = 0; $i < 10; $i++) {
    $userId = $snowflake->nextId();
    echo "生成的用户ID: {$userId}<br/>";
}

Vercel

<?php

/**
 * 雪花算法(Snowflake)PHP实现
 * 
 * 雪花算法是由Twitter开发的分布式唯一ID生成算法,结构如下:
 * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
 * 
 * 第1位:符号位,始终为0
 * 第2-42位:41位时间戳(毫秒级),可以使用69年
 * 第43-43位:1位数据中心ID
 * 第44-48位:5位机器ID
 * 第49-53位:5位数据中心内机器ID
 * 第54-64位:12位序列号,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒产生4096个ID序号
 */
class Snowflake {
    /**
     * 开始时间戳(2020-01-01)
     * 这是一个自定义的起始时间,用于计算相对时间戳
     */
    const START_TIMESTAMP = 1577808000000; // 2020-01-01 00:00:00 GMT

    /**
     * 各部分占用的位数
     */
    const SEQUENCE_BITS = 12;       // 序列号占用的位数
    const MACHINE_ID_BITS = 5;      // 机器ID占用的位数
    const DATACENTER_ID_BITS = 5;   // 数据中心ID占用的位数

    /**
     * 各部分的最大值
     */
    const MAX_SEQUENCE = -1 ^ (-1 << self::SEQUENCE_BITS);           // 序列号最大值 4095
    const MAX_MACHINE_ID = -1 ^ (-1 << self::MACHINE_ID_BITS);       // 机器ID最大值 31
    const MAX_DATACENTER_ID = -1 ^ (-1 << self::DATACENTER_ID_BITS); // 数据中心ID最大值 31

    /**
     * 各部分向左的位移
     */
    const MACHINE_ID_SHIFT = self::SEQUENCE_BITS;                                     // 机器ID向左移12位
    const DATACENTER_ID_SHIFT = self::SEQUENCE_BITS + self::MACHINE_ID_BITS;          // 数据中心ID向左移17位
    const TIMESTAMP_SHIFT = self::SEQUENCE_BITS + self::MACHINE_ID_BITS + self::DATACENTER_ID_BITS; // 时间戳向左移22位

    /**
     * @var int 数据中心ID
     */
    private $datacenterId;

    /**
     * @var int 机器ID
     */
    private $machineId;

    /**
     * @var int 毫秒内序列号
     */
    private $sequence = 0;

    /**
     * @var int 上次生成ID的时间戳
     */
    private $lastTimestamp = -1;

    /**
     * 构造函数
     *
     * @param int $datacenterId 数据中心ID (0~31)
     * @param int $machineId 机器ID (0~31)
     * @throws Exception 当数据中心ID或机器ID超出范围时抛出异常
     */
    public function __construct($datacenterId = 0, $machineId = 0) {
        // 检查数据中心ID和机器ID是否在有效范围内
        if ($datacenterId > self::MAX_DATACENTER_ID || $datacenterId < 0) {
            throw new Exception("数据中心ID超出范围: 应为0~" . self::MAX_DATACENTER_ID);
        }
        
        if ($machineId > self::MAX_MACHINE_ID || $machineId < 0) {
            throw new Exception("机器ID超出范围: 应为0~" . self::MAX_MACHINE_ID);
        }
        
        $this->datacenterId = $datacenterId;
        $this->machineId = $machineId;
    }

    /**
     * 获取下一个ID
     *
     * @return string 生成的ID(返回字符串是因为PHP的整数范围可能不足以存储64位ID)
     * @throws Exception 当时钟回拨时抛出异常
     */
    public function nextId() {
        // 获取当前时间戳(毫秒)
        $timestamp = $this->getCurrentTimestamp();
        
        // 检查时钟回拨
        if ($timestamp < $this->lastTimestamp) {
            throw new Exception("时钟回拨,拒绝生成ID,上次时间: " . 
                                $this->lastTimestamp . ", 当前时间: " . $timestamp);
        }
        
        // 如果是同一毫秒内,则增加序列号
        if ($timestamp == $this->lastTimestamp) {
            // 序列号递增
            $this->sequence = ($this->sequence + 1) & self::MAX_SEQUENCE;
            // 如果序列号溢出,则等待下一毫秒
            if ($this->sequence == 0) {
                $timestamp = $this->waitNextMillis($this->lastTimestamp);
            }
        } else {
            // 不同毫秒内,序列号重置为0
            $this->sequence = 0;
        }
        
        // 更新上次生成ID的时间戳
        $this->lastTimestamp = $timestamp;
        
        // 计算相对时间戳(相对于开始时间)
        $timestampDiff = $timestamp - self::START_TIMESTAMP;
        
        // 组合各部分生成ID
        // 注意:PHP的整数范围可能不足以存储64位ID,所以使用字符串或GMP扩展处理大整数
        $id = (($timestampDiff << self::TIMESTAMP_SHIFT) |
               ($this->datacenterId << self::DATACENTER_ID_SHIFT) |
               ($this->machineId << self::MACHINE_ID_SHIFT) |
               $this->sequence);
               
        return (string)$id;
    }

    /**
     * 获取当前时间戳(毫秒)
     *
     * @return int 当前时间戳(毫秒)
     */
    private function getCurrentTimestamp() {
        // 获取微秒级时间戳并转换为毫秒
        return (int)floor(microtime(true) * 1000);
    }

    /**
     * 等待下一毫秒
     *
     * @param int $lastTimestamp 上次生成ID的时间戳
     * @return int 新的时间戳(毫秒)
     */
    private function waitNextMillis($lastTimestamp) {
        $timestamp = $this->getCurrentTimestamp();
        // 循环等待,直到获得新的时间戳
        while ($timestamp <= $lastTimestamp) {
            $timestamp = $this->getCurrentTimestamp();
        }
        return $timestamp;
    }
}

// 使用示例
try {
    // 创建雪花算法实例,参数为数据中心ID和机器ID
    $snowflake = new Snowflake(1, 1);
    
    // 生成10个ID
    echo "生成的ID示例:\n";
    for ($i = 0; $i < 10; $i++) {
        echo $snowflake->nextId() . "\n";
    }
} catch (Exception $e) {
    echo "错误: " . $e->getMessage();
}
?>

文心一言

<?php
 
class Snowflake {
    // 定义雪花ID的各部分位数
    private const TIMESTAMP_BITS = 41; // 时间戳位数
    private const NODE_ID_BITS = 10;  // 节点ID位数
    private const SEQUENCE_BITS = 12; // 序列号位数
 
    // 定义起始时间戳(这里以2020-01-01为例)
    private const EPOCH = 1577836800000;
 
    // 定义最大取值范围
    private const MAX_NODE_ID = (1 << self::NODE_ID_BITS) - 1;
    private const MAX_SEQUENCE = (1 << self::SEQUENCE_BITS) - 1;
 
    // 定义偏移量
    private const TIMESTAMP_SHIFT = self::NODE_ID_BITS + self::SEQUENCE_BITS;
    private const NODE_ID_SHIFT = self::SEQUENCE_BITS;
 
    private $nodeId;           // 节点ID
    private $lastTimestamp = -1; // 上次生成ID的时间戳
    private $sequence = 0;     // 序列号
 
    /**
     * 构造函数,用于初始化节点ID
     *
     * @param int $nodeId 节点ID
     * @throws InvalidArgumentException 如果节点ID超出范围
     */
    public function __construct($nodeId) {
        if ($nodeId < 0 || $nodeId > self::MAX_NODE_ID) {
            throw new InvalidArgumentException("Invalid node ID, must be between 0 and " . self::MAX_NODE_ID);
        }
        $this->nodeId = $nodeId;
    }
 
    /**
     * 生成下一个唯一的ID
     *
     * @return int 生成的唯一ID
     * @throws RuntimeException 如果系统时钟回拨
     */
    public function generateId() {
        $currentTimestamp = $this->timestamp();
 
        // 检查时钟回拨
        if ($currentTimestamp < $this->lastTimestamp) {
            throw new RuntimeException("Clock moved backwards");
        }
 
        // 如果当前时间戳与上次相同,则递增序列号
        if ($currentTimestamp == $this->lastTimestamp) {
            $this->sequence = ($this->sequence + 1) & self::MAX_SEQUENCE;
 
            // 如果序列号溢出,则等待下一毫秒
            if ($this->sequence == 0) {
                $currentTimestamp = $this->untilNextMillis($this->lastTimestamp);
            }
        } else {
            // 如果时间戳不同,则重置序列号
            $this->sequence = 0;
        }
 
        // 更新上次生成ID的时间戳
        $this->lastTimestamp = $currentTimestamp;
 
        // 组合时间戳、节点ID和序列号生成唯一的ID
        return (($currentTimestamp - self::EPOCH) << self::TIMESTAMP_SHIFT) |
               ($this->nodeId << self::NODE_ID_SHIFT) |
               $this->sequence;
    }
 
    /**
     * 获取当前时间戳(毫秒)
     *
     * @return int 当前时间戳
     */
    private function timestamp() {
        return round(microtime(true) * 1000);
    }
 
    /**
     * 等待下一毫秒
     *
     * @param int $lastTimestamp 上次生成ID的时间戳
     * @return int 下一毫秒的时间戳
     */
    private function untilNextMillis($lastTimestamp) {
        $currentTimestamp = $this->timestamp();
        while ($currentTimestamp <= $lastTimestamp) {
            $currentTimestamp = $this->timestamp();
        }
        return $currentTimestamp;
    }
}
 
// 示例使用
$nodeId = 1; // 设置节点ID
$snowflake = new Snowflake($nodeId);
 
// 生成10个唯一ID
for ($i = 0; $i < 10; $i++) {
    $id = $snowflake->generateId();
    echo "Generated ID: $id\n";
}

讯飞星火

讯飞星火在生成代码的过程中居然出现了BUG, 代码在生成过程中, 开头生成的代码莫名消失, 最后生成的代码如下

 self::MAX_DATA_CENTER_ID || $dataCenterId < 0) {
            throw new Exception("Data Center ID can't be greater than " . self::MAX_DATA_CENTER_ID . " or less than 0");
        }
        if ($machineId > self::MAX_MACHINE_ID || $machineId < 0) {
            throw new Exception("Machine ID can't be greater than " . self::MAX_MACHINE_ID . " or less than 0");
        }
        $this->dataCenterId = $dataCenterId;
        $this->machineId = $machineId;
    }

    public function nextId() {
        $timestamp = $this->timeGen();

        if ($timestamp < $this->lastTimestamp) {
            throw new Exception("Clock moved backwards. Refusing to generate id for " . ($this->lastTimestamp - $timestamp) . " milliseconds");
        }

        if ($this->lastTimestamp == $timestamp) {
            $this->sequence = ($this->sequence + 1) &amp; self::MAX_SEQUENCE;
            if ($this->sequence == 0) {
                $timestamp = $this->tilNextMillis($this->lastTimestamp);
            }
        } else {
            $this->sequence = 0;
        }

        $this->lastTimestamp = $timestamp;

        return (($timestamp - self::EPOCH) << self::TIMESTAMP_SHIFT) |
               ($this->dataCenterId << self::DATA_CENTER_ID_SHIFT) |
               ($this->machineId << self::MACHINE_ID_SHIFT) |
               $this->sequence;
    }

    protected function tilNextMillis($lastTimestamp) {
        $timestamp = $this->timeGen();
        while ($timestamp <= $lastTimestamp) {
            $timestamp = $this->timeGen();
        }
        return $timestamp;
    }

    protected function timeGen() {
        return round(microtime(true) * 1000); // 获取当前时间的毫秒级时间戳
    }
}

// 使用示例
try {
    $snowflake = new Snowflake(1, 1); // 数据中心ID和机器ID都设置为1
    echo $snowflake->nextId(); // 生成一个唯一的ID
} catch (Exception $e) {
    echo 'Error: ' . $e->getMessage();
}
?>

基于雪花算法的ID生成器 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下 EPOCH 属性)。12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号。加起来刚好64位,为一个Long型。 阅读详情

相关推荐

雪花算法中非常好用的数字ID生成器yitter

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。最佳实践(置顶)针对大家在测试过程中,经常出现的性能问题,以下给出3组最佳实践配置:如果生成ID速度不超过5W/s,不用修改任何配置参数如果生成ID速度超过5W/s,低于50W,推荐修改:SeqBitLength=10如果生成ID速度超过50W/s,接近500W,推荐修改:SeqBitLength=12。

pleaseprintf的博客 2022

雪花算法(PHP)

简介现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中id的全局唯一性。对于MySQL而言,一个表中的主键id一般使用自增的方式,但是如果进行水平分表之后,多个表中会生成重复的id值。那么如何保证水平分表后的多张表中的id是全局唯一性的呢?如果还是借助数据库主键自增的形式,那么可以让不同表初始化一个不同的初始值,然后按指定的步长进行自增。例如有3张拆分表,初始主键值为1,2,3,自增步长为3。...

code_nutter的博客 2884

Trae vs Cursor:哪个AI编程助手更适合你的开发需求?(2024实测对比)

本文深度对比了2024年两款主流AI编程助手Trae和Cursor的核心功能与适用场景。通过实测数据展示两者在开发环境、代码生成、智能交互及团队协作等方面的差异,帮助开发者根据项目需求、团队规模和技术栈选择最适合的AI辅助工具,提升开发效率。

weixin_29281915的博客 683

PHP雪花算法

它由Twitter公司的工程师Snowman(Snowflake的创造者)设计,用于生成全局唯一的ID,以应对分布式系统中唯一性标识的需求。雪花算法的特点是简单、高效,且生成的ID是递增的,具有一定的时间顺序性。它的核心思想是将64位的ID划分为不同的部分,分别表示时间戳、机器节点ID和序列号,保证生成的ID在不同节点之间不冲突,且在同一节点上保持唯一性。由于时间戳占据了大部分位数,所以生成的ID在一定程度上是有序的,方便在数据库索引上的排序。

withoutfear的博客 1748

MySQL建表避坑指南:从字段类型到主键设计的生产级实践

MySQL建表是数据库开发的起点,本质是定义数据存储结构与访问契约。理解INT/BIGINT的符号性、VARCHAR在utf8mb4下的字节开销、DATETIME与TIMESTAMP的时区与范围差异,是避免线上事故的基础。主键选择直接影响聚簇索引性能和分布式扩展能力,而字符集(utf8mb4)、校对规则(utf8mb4_0900_ai_ci)和NOT NULL约束则决定了数据一致性与查询稳定性。这些设计决策不仅关乎语法正确性,更直接关联存储效率、并发吞吐与分库分表演进路径。本文聚焦真实生产场景中的建表逻辑、

weixin_30460489的博客 434

PHP实现雪花Snowflake算法(附完整源码)

PHP实现雪花Snowflake算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 653

超强分布式ID方案:Hyperf雪花算法实战指南

还在为分布式系统中的ID冲突烦恼吗?一文解决你的全局唯一ID生成难题! 通过阅读本文,你将获得: - ✅ 雪花算法核心原理深度解析 - ✅ Hyperf雪花ID组件完整使用指南 - ✅ 实战案例:数据库模型集成雪花ID - ✅ 自定义扩展方案与最佳实践 ## 为什么需要分布式ID? 在微服务架构中,传统自增ID面临严峻挑战: - 多个服务实例可能生成相同ID - 数据库分片时ID难以保证

gitblog_00352的博客 959

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 381

Laravel-admin分布式ID生成终极指南:雪花算法快速实现教程

在构建现代化的Laravel后台管理系统时,**分布式ID生成**是处理高并发场景的关键技术。今天,我将为您详细介绍如何在laravel-admin中集成**雪花算法(Snowflake)**,实现高效、有序、全局唯一的分布式ID生成方案。无论您是laravel-admin的新手还是经验丰富的开发者,这篇终极指南都将帮助您快速掌握这一重要技能。 [![laravel-admin雪花算法分布式ID

gitblog_00020的博客 365

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

OpenCV机械臂手眼标定

这篇文章总结了手眼标定的原理,利用OpenCV自带的函数套用参数即可完成眼在手上和眼在手外两种标定。

Q先森的博客 6588

Laravel Snowflake 常见问题解决方案

Laravel Snowflake 常见问题解决方案 项目基础介绍 Laravel Snowflake 是一个为 Laravel 框架设计的生成 64 位唯一标识符的扩展包。该扩展基于 Twitter 的雪花算法(Snowflake Algorithm),可以生成全局唯一且时间有序的 ID。主要编程语言为 PHP。 新手常见问题及解决步骤 问题一:如何安装 Laravel Snowflake? 解...

gitblog_00064的博客 812

从VBA到Python:探索CODE V API在MTF数据分析中的跨语言实践

本文详细介绍了如何从VBA转向Python,利用CODE V API实现MTF数据分析的高效工作流。通过Python的科学计算库和现代API设计,光学工程师可以大幅提升数据处理和可视化效率,实现自动化报告生成和性能优化。

weixin_29239661的博客 441

伪原创工具【php源码】

12位:循环位(随机数),对于同一毫秒产生的不同id,12位最高可以记录4095个,也就是最多记录4095个,超过的需要的下一毫秒。大家好,小编为大家解答python雪花算法生成id的问题。很多人还不知道用pycharm画雪花代码,现在让我们一起来看看吧!Snowflake是Twitter提出的一个算法,其目的是生成一个64位的整数;10位:前五位(机房编号/数据中心)后五位(机器编号)41位:用来记录时间戳(可以记录69年)1位:一般是符号位,不做处理。

wenangou的博客 217

EMC系列EtherCAT总线运动控制器(二):Motion通讯连接、总线配置及诊断

雷赛-EMC系列EtherCAT总线运动控制器(二):Motion通讯连接、总线配置及诊断

weixin_38570076的博客 1884

深入浅出:拆解RK3588 DVP摄像头驱动框架,从DTS配置到V4L2子系统

本文深入解析RK3588 DVP摄像头驱动框架,从DTS配置到V4L2子系统的完整实现。详细介绍了瑞芯微RK3588的多媒体子系统架构、设备树配置逻辑、rkcif驱动与V4L2框架的交互机制,以及用户空间调试与性能优化技巧,帮助开发者解决DVP摄像头驱动中的常见问题。

weixin_42525632的博客 265

PHP后端面试核心考点与实战解析

在Web开发领域,PHP作为经典的服务器端脚本语言,其变量作用域、垃圾回收机制等语言特性直接影响代码性能与安全性。理解OPcache原理、预处理语句防注入等优化技术,能有效提升应用吞吐量。数据库层面,B+树索引优化与Redis持久化策略是解决高并发场景的关键技术,而微服务架构下的服务发现机制则体现了分布式系统设计能力。本文结合PHP8的JIT编译器等新特性,深入解析面试中常见的LRU缓存实现、短链接系统设计等实战题型,帮助开发者掌握从语言基础到架构设计的全栈技能。

weixin_34320724的博客 518

使用 Simulink 进行电力电子系统的效率优化仿真

电力电子系统(Power Electronics System)是现代电力系统和工业自动化中的关键组成部分,广泛应用于可再生能源发电、电动汽车、不间断电源(UPS)、电机驱动等领域。为了提高系统的整体性能和经济性,必须对电力电子系统的效率进行优化。效率优化的目标是最大化系统的能量转换效率,减少损耗,从而提高系统的可靠性和经济效益。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电力电子系统的效率优化策略。本教程将详细介绍如何使用 Simulink 进行电力电子系统的效率优化仿真。

xiaoheshang_123的博客 355

生成唯一流水号的方法

场景:基于导入excel时需要生成一串唯一值的字符串,既不能是主键值,又需要保证值的唯一性。于是我百度AI查询了方案。方案一 通过时间戳生成的纯数字的字符串,好处就是简单明了,但是不适合高并发,虽然我这小破项目不存在高并发。方案二, 这是我一开始使用的生成的一长串 有字母有数字的字符串,我就是看着难受,不喜欢,被我淘汰了。我之前的项目里就是做过php调用snowflake(也出现过那么一两次的高并发重复情况)此处不得不说的就是Hutool(其他的我就不写了)方案三,有人详细优化一下这里的算法吗?

lmmusus的博客 564

2024美团秋招硬件开发笔试真题及答案解析

在 Linux 内核的网络设备驱动中,数据链路层的功能通常由网络协议栈的低层(如以太网驱动)实现,而不是作为网络设备驱动的一个独立层次。在 FreeRTOS 中,任务通知(Task Notifications)是一种轻量级的事件传递机制,用于在任务之间或任务与中断之间传递信号。小美正在开发一个简单的密码生成器,其中一个功能是将输入的字符串中的所有字母按字母顺序循环前移一位(即 'a' 变为 'z','B' 变为 'A',以此类推)。它包含了网络设备的各种参数和方法,用于管理网络设备的初始化、配置和操作。

XU157303764的博客 1675

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

记录thinkphp5 修改数据表id为分布式id

项目需要和java合作,部分表采用了分布式主键id 解决方式是用model类自带的事件回调 因为model类的插入都有调用插入事件,直接在需要的表模型中重写方法 在model底层类save方法中有如下事件调用 if (false === $this->trigger('before_insert', $this)) { return false; } 增加分布式trait类 trait DistributionTrait { protected static

qq_36384765的博客 763

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Thinkphp和Laravel框架 微信小程序交通事故快速处理汽车 理赔

简单说,一个管安全规则,一个管身份凭证,组合起来为Web应用打造可靠防护。2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。

我的个人的博客 418

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

springboot企业即时通信系统-开题报告

Hbuilderx;Flask 是一个轻量级的 Web 框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便且容易上手,小型团队在短时间内就可以完成功能丰富的中小型网站或 Web 服务的实现。8、AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。

mind526的博客 905

【开题答辩实录分享】以《智能垃圾回收小程序》为例进行答辩实录分享

核心是开发一款基于微信小程序的智能垃圾回收系统,解决传统回收中 “线上预约缺失” 的痛点,同时满足多角色管理需求。系统分为小程序前端和网页后端,小程序端面向用户,提供回收预约、订单查询、垃圾分类查询、个人中心管理等功能;网页端面向管理员、商家和回收员,管理员可实现用户 / 回收员 / 垃圾分类 / 订单等信息的增删改查与审核,商家负责回收员与订单管理,回收员可管理个人信息并处理上门取件任务

2509_93102599的博客 958

小白程序员的学习路线

UI需要学习的模块 PS:会使用PS抠图、切图,以及融图,尽可能地多学一些PS的技巧! AI:会使用AI制作一些LOGO,以及简单的排版等技巧! CorelDRAW:配合AI制作一些矢量图形,以及会抠图等技巧! PR:它是一款功能强大的的视频剪辑编辑软件,适用于给视频添加音乐、添加字幕等。 AE:它是一款图形视频处理软件,适用于从事设计和视频特技、动画制作、以及个人后期制作以及多媒体制作等。 C4D:它是一款功能强大的专业3D建模工具,图形的设计到模型的创建,都可以独立完成! AU:它是一款用于音频的处理软

weixin_44211905的博客 769

【项目实战】从 0 到 1 构建智能协同云图库(五):用户传图与元数据自动解析

强调。

2403_89414889的博客 366
上一篇: 宝塔邮局+Roundcube Webmail自建邮局部署说明
下一篇: fastadmin 手动建一个新模块流程
withoutfear
博客等级 码龄13年 541粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

withoutfear

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值