不同AI生成的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的时间戳,初始化为 -1private $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的时间戳,则说明系统时钟回拨,无法生成IDif ($timestamp < $this->lastTimestamp) {throw new Exception("时钟回拨异常,拒绝生成ID. 差值: " . ($this->lastTimestamp - $timestamp) . " 毫秒");}// 如果当前时间与上次生成ID时间相同,表示同一毫秒内生成多个IDif ($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; // 机器标识IDprivate $datacenterId; // 数据中心IDprivate $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个IDfor ($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; // 符号位,始终为0const 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); // 31const MAX_WORKER_ID = -1 ^ (-1 << self::WORKER_ID_BIT); // 31const 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和机器节点IDprivate $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; // 最大的数据中心IDconst MAX_MACHINE_ID = (1 << self::MACHINE_ID_BITS) - 1; // 最大的机器IDconst 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; // 数据中心IDprivate $machineId; // 机器IDprivate $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");}// 如果当前时间戳与上一次的时间戳相同,同一毫秒内生成多个IDif ($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个唯一IDfor ($i = 0;$i < 10; $i++) {$id =$snowflake->nextId();echo $id . "\n";}// 创建另一个Snowflake实例,数据中心ID为1,机器ID为2$snowflake2 = new Snowflake(1, 2);// 生成并输出10个唯一IDfor ($i = 0;$i < 10; $i++) {$id =$snowflake2->nextId();echo $id . "\n";}// 创建另一个Snowflake实例,数据中心ID为2,机器ID为1$snowflake3 = new Snowflake(2, 1);// 生成并输出10个唯一IDfor ($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); // 序列号最大值 4095const MAX_MACHINE_ID = -1 ^ (-1 << self::MACHINE_ID_BITS); // 机器ID最大值 31const 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;// 批量生成多个IDecho "批量生成5个ID:" . PHP_EOL;for ($i = 0; $i < 5; $i++) {echo $snowflake->nextId() . PHP_EOL;}
} catch (Exception $e) {echo "错误: " . $e->getMessage() . PHP_EOL;
}
?>
豆包
<?phpclass 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; // 数据中心 IDprivate $dataCenterId; // 机器 IDprivate $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;// 生成最终的 IDreturn (($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; // 数据中心IDprivate int $machineId; // 机器IDprivate 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); // 序列号最大值 4095const MAX_MACHINE_ID = -1 ^ (-1 << self::MACHINE_ID_BITS); // 机器ID最大值 31const 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个IDecho "生成的ID示例:\n";for ($i = 0; $i < 10; $i++) {echo $snowflake->nextId() . "\n";}
} catch (Exception $e) {echo "错误: " . $e->getMessage();
}
?>
文心一言
<?phpclass 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; // 节点IDprivate $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和序列号生成唯一的IDreturn (($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) & 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都设置为1echo $snowflake->nextId(); // 生成一个唯一的ID
} catch (Exception $e) {echo 'Error: ' . $e->getMessage();
}
?>
相关文章:
不同AI生成的PHP版雪花算法
OpenAI <?php /*** Snowflake 雪花算法生成器* 生成的 64 位 ID 结构:* 1 位 保留位(始终为0,防止负数)* 41 位 时间戳(毫秒级,当前时间减去自定义纪元)* 5 位 数据中心ID* 5 …...
texstudio: 编辑器显示行号+给PDF增加行号
texstudio在编辑器部分增加行号: texstudio默认在编辑器部分不显示行号,如下图: 要实现以下的在编辑部分增加行号: 执行如下操作: 选项-->设置TexStudio-->编辑器-->显示行号-->所有行号选择好后&…...
强化学习基础-马尔可夫决策过程与贝尔曼方程
马尔可夫决策过程 在老虎机问题中,无论智能代理采取什么行动,之后要解决的问题都是一样的。也就是寻找最好的老虎机。但现实生活中的问题是不同的。例如,在围棋游戏中,智能代理落子后,棋盘上的棋子排列会发生变化&…...
爬虫的精准识别:基于 User-Agent 的正则实现
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
Scala的初步使用
目录 1. Scala简介2. Scala编写的Hello World2.1 pom.xml中依赖和插件的配置2.2 安装Scala2.12.172.3 安装code-server插件2.4 helloworld.scala2.5 helloworld2.scala2.6 java调用scala object 3. Scala调用Java3.1 例子13.2 例子2 参考 1. Scala简介 Scala是一门多范式的编程…...
【Json RPC框架】框架介绍与环境搭建(Ubuntu 22.04)
🎁个人主页:我们的五年 🔍系列专栏:Json RPC框架 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 JSon RPC框架系列文章Json RPC框架_我们的五年的博…...
python读取word文档 | AI应用开发
python读取word文档 | AI应用开发 RAG中python读取word文档 RAG系统中构建知识库流程中重要的一个步骤是读取外挂的知识文档,为word是其中比较常见的文件。 另一个值得注意的是,RAG在读取文档后需要对文档进行分割,而良好的分割需要有一定结…...
20、组件懒加载
组件懒加载,也被称为异步组件加载,是一种在 Vue 项目中提升性能的重要技术手段。下面从概念、实现原理、使用场景、实现方式几个方面详细介绍: 概念 在传统的 Vue 项目里,当应用启动时,所有的组件代码都会被一次性加…...
打造智能钉钉机器人:借助智谱GLM-4-Flash实现高效智能回复(文末附源码)
文章目录 前言一、准备工作(一)钉钉机器人(二)智谱 GLM-4-Flash(三)内网穿透工具 cpolar(四)需要准备的工具和环境 二、钉钉机器人的创建与配置步骤1:创建钉钉机器人步骤…...
【故障处理系列--docker卷的挂载】
一位伙伴需求是把容器的目录映射到宿主机且容器目录的内容不被宿主机的空白目录覆盖。我的第一反应是-v 卷的映射,参数是对的,但是用法是错的 1、容器卷的挂载方式 容器把目录映射到宿主机创建volume卷,然后把容器的目录和volume卷绑定 区别…...
兴达易控modbusTCP转profinet接防撞雷达测试
modbusTCP转profinet接防撞雷达测试 随着工业自动化程度的不断提高,现场设备之间的通信需求日益增长。ModbusTCP作为一种广泛应用的工业通信协议,因其简单、可靠的特点,被广泛应用于各种自动化设备中。而Profinet作为工业以太网的一种&#…...
Acknowledgment.nack方法重试消费kafka消息异常
文章目录 问题示例异常 原因nack方法Acknowledgment接口实现类:ConsumerAcknowledgment实现类:ConsumerBatchAcknowledgment 解决方案1 批量消费指定index示例 2 单条消费示例 问题 使用BatchAcknowledgingMessageListener 批量消费Kafka消息࿰…...
通过动态获取后端数据判断输入的值打小
eval() 函数在 JavaScript 中是一个非常强大的函数 【1】计算简单公式 很多时候如果需要动态的提供计算的公式,需要写一大段的公式计算逻辑去兼容,可能耗费大量的开发成本。为了快速了解 eval 的用法,直接 ① 打开浏览器;② F1…...
乐维网管平台核心功能解析(一)——告警关联知识
在数字化转型浪潮中,企业IT系统规模呈指数级增长,传统的"人工经验"运维模式已难以应对海量告警处理需求。某银行数据中心曾统计,其日均告警量突破10万条,关键故障的平均定位时间长达3.5小时,直接导致年损失超…...
数据结构_单链表
今天我们要开启链表的学习 🖋️🖋️🖋️ 学了顺序表我们可以知道: 🎈链表其实就是争对顺序表的缺点来设计的,补足的就是顺序表的缺点 🎈链表在物理上是上一个节点存放的下一个节点的地址 链表 …...
b站视频下载工具软件怎么下载
自行配置FFMPEG环境 请优先选择批量下载,会自处理视频和音频文件。 如果要下载更高质量请登陆。 没有配置FFMPEG下载后会有报错提示,视频音频文件无法合并生成mp4文件 更新批量下载标题,只取视频原标题,B站反爬机制登陆后下载多了…...
如何实现pinia的持久化存储
在 Vue 3 项目中使用 Pinia 进行状态管理时,若要实现持久化存储,可借助 pinia-plugin-persistedstate 插件,该插件能让 Pinia 存储的状态在页面刷新或关闭后依然保留。下面为你详细介绍实现步骤: 1. 安装插件 首先,在…...
webpack介绍
entry与output 入口是 Webpack 开始构建依赖图的起点,Webpack 会从入口文件开始,递归地分析项目的依赖图。输出指定 Webpack 打包后的文件存放位置和文件名。 const path require("path");module.exports {entry: "./src/index.js&qu…...
使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图
以下是使用Mermaid语法绘制的C语言程序从Linux移植到Windows的流程图: graph TDA[开始移植] --> B[代码兼容性检查]B --> C[检查系统调用差异\nfork/exec -> CreateProcess]B --> D[检查文件路径格式\n/ vs \\]B --> E[检查依赖库兼容性\nPOSIX vs …...
蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码
文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言:STM32G431RBT6实现嵌入式组第七届题目解析源码&…...
【spring bean的生命周期】
以下是使用 Mermaid 绘制的 Spring Bean 生命周期流程图: 流程说明 实例化:Spring 容器创建 Bean 的实例。属性赋值:Spring 为 Bean 的属性注入值(依赖注入)。BeanPostProcessor.postProcessBeforeInitialization&…...
数据类设计_图片类设计之3_半规则图类设计(前端架构基础)
前言 学的东西多了,要想办法用出来.C和C是偏向底层的语言,直接与数据打交道.尝试做一些和数据方面相关的内容 引入 接续上一篇讨论半规则图类型的设计 半规则图的定义 什么是半规则图?笔者看见了一些似乎规则又不是太规则的图形,例如带圆角的矩阵,在页面上找一个圆角框 为了…...
【leetcode hot 100 138】随机链表的复制
解决一:回溯 哈希表 本题要求我们对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建…...
如何安全处置旧设备?
每年,数百万台旧设备因老化、故障或被新产品取代而被丢弃,这些设备上存储的数据可能带来安全风险。 如果设备没有被正确删除数据,这些数据往往仍可被恢复。因此,安全处置旧设备至关重要。 旧设备可能包含的敏感数据 旧设备中可能…...
Windows 万兴恢复专家 Wondershare Recoverit-v13.5.7.9-[电脑数据恢复工具]
Windows 万兴恢复专家Wondershare_Recoverit 链接:https://pan.xunlei.com/s/VOL3z608vzAj_IYTvH-F1q7kA1?pwdiu89# 1. 打开Setup.exe进行安装,安装完不要打开软件,记住安装目录 2. 将"Crack"文件夹内的所有文件复制到安装目录 …...
eLection: 1靶场渗透测试
eLection: 1 来自 <eLection: 1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.196 3,对靶机进行端口服…...
类与对象(下)
1 . 再谈构造函数 1.1构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class B { public:B(int a0){_a a;} private:int _a; };虽然上述构造函数调用之后,对象中已经有了一个初始值…...
数字人源头技术搭建模型--v10追踪推理逻辑
数字人源头技术搭建模型--v10追踪推理逻辑 #数字人# #数字人技术源头saas开发# 数字人源头技术搭建模型V10的追踪推理逻辑通常涉及以下几个关键方面: 数据收集与预处理 - 多模态数据采集:收集图像、音频等多模态数据。例如通过摄像头采集人物的面部…...
基于Asp.net的高校迎新管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
商业智能BI的未来,如何看待AI+BI这种模式?
昨天在和一位朋友线上聊天的时候,提了一个问题,你是如何看待AI(人工智能)BI(商业智能)这种模式和方向的,我大概来说一下我个人的看法。 以我在商业智能BI项目中接触到的行业和企业,…...
C++ 编程指南27 - 始终将 mutex 与它所保护的数据一起定义,并尽可能使用 synchronized_value<T>
一:概述 在多线程编程中,互斥锁(std::mutex)的作用是保护共享数据的访问。但如果 mutex 和它保护的数据分开定义,可能会导致以下问题: 锁的使用不明显:程序员可能会忘记获取 mutex 就访问数据&…...
选择 DotNetBrowser 还是 EO.WebBrowser
您是否正在为 .NET 应用寻找 Web 视图控件?如果是的话,那您真是太幸运了!.NET 生态系统提供了丰富的选择。既有开源和专有的免费 Web 视图控件,也有许多企业广泛选择的商业 Web 视图控件。 在这篇博客文章中,我们将对…...
ngin配置内网服务-具体案例【天地图】
ngin配置内网服务-具体案例【天地图】 描述需求整体网络架构1. 政务内网服务器(10.10.10.70)2. 网闸(10.10.10.240:8088)3. 跳板机(10.10.20.70:9109)4. 天地图服务 具体步骤第一步:配置跳板机&…...
【网络】poll 与epoll(原理、工作模式LT、ET)
文章目录 1. poll2. epoll3. epoll原理4. epoll工作模式4.1 水平模式LT4.2 边缘模式ET 在前面用的select中,它的使用方式非常麻烦,而且能支持的文件描诉符太少了。 下面来介绍一下更加方便、高效的方式: 1. poll poll函数接口: include <…...
DeepIn Wps 字体缺失问题
系统缺失字体 Symbol 、Wingdings 、Wingdings2、Wingdings3、MT—extra 字体问题 问了下DeepSeek 在应用商店安装或者在windows 里面找 装了一个GB-18030 还是不行 在windows里面复制了缺失的字体 将字体复制到DeepIn 的字体目录(Ubuntu 应该也是这个目录&am…...
Spring有哪些缺点?
大家好,我是锋哥。今天分享关于【Spring有哪些缺点?】面试题。希望对大家有帮助; Spring有哪些缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring是一个非常流行的Java框架,提供了丰富的功能和灵活的配置选项…...
使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile
比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤&…...
蓝桥杯刷题周计划(第二周)
目录 前言题目一题目代码题解分析 题目二题目代码题解分析 题目三题目代码题解分析 题目四题目代码题解分析 题目五题目代码题解分析 题目六题目代码题解分析 题目七题目代码题解分析 题目八题目题解分析 题目九题目代码题解分析 题目十题目代码题解分析 题目十一题目代码题解分…...
03 | fastgo 项目规范及目录结构介绍
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入我的训练营:云原生AI实战营,一个助力 Go 开发者在 AI 时代建立技术竞争力的实战营。 为了让你更好的学习本课程。本节课,我来简单介绍下 fastgo…...
K8S学习之基础二十三:k8s的持久化存储之nfs
K8S持久化存储之nfs 在 Kubernetes (k8s) 中使用 NFS(Network File System)作为存储解决方案是一种常见的方式,特别是在需要共享存储的场景中。以下是关于如何在 Kubernetes 中使用 NFS 存储的详细说明: 1. 准备 NFS 服务器 …...
CTF代码学习日记 Python
os模块 在Python中,os是一个内置的标准模块,主要用于与操作系统进行交互,提供了许多操作文件、目录、进程等的功能。 例如: os.mkdir()用于创建新目录os.rmdir()用于删除空目录os.listdir()可以列出指定目录下的所有文件和目录…...
存储优化(protobuf与mmkv)
存储优化(protobuf与mmkv) 在Android应用开发中,数据存储是一个基础且关键的环节。随着应用功能的日益复杂,数据量的增加,传统的存储方式如SharedPreferences、SQLite等在性能上的局限性逐渐显现。本文将深入探讨两种…...
MTK Android12 添加GMS后,报“设备未经过play保护认证“问题
文章目录 问题解决 问题 在MTK平台的Android12机柜上面,客户要求安装GMS。安装后,打开发现报"设备未经过play保护认证"问题,无法使用。解决 路径:/build/make/tools/buildinfo.sh diff --git a/build/make/tools/bui…...
自定义Linux网络协议的开发与测试
在当今快速发展的技术领域中,定制化网络协议可以为特定的应用场景提供灵活而强大的解决方案。本文将详细介绍如何在Linux系统上开发一个自定义网络协议,并编写相应的用户空间程序进行测试。所有步骤基于2025年3月11日的时间点完成。 开发自定义协议内核模块 定义协议和实现…...
Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南
📌 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器,可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…...
说一下spring的事务隔离级别?
大家好,我是锋哥。今天分享关于【说一下spring的事务隔离级别?】面试题。希望对大家有帮助; 说一下spring的事务隔离级别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring的事务隔离级别是指在数据库事务管理中…...
【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用
深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识,都会有新的领悟。大约 2 年前,我曾就这一技术方向撰写过另一篇短文《从类型转换视角,浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…...
C++ Primer Plus第十二章课后习题总结
1. 对于下面的类声明: class Cow {char name[20];char * hobby;double weight;public:Cow();Cow(const char * nm, const char * ho, double wt);Cow(const Cow c&);~Cow();Cow & operator(const Cow & c);void ShowCow() const; // display all cow d…...
Xavier 初始化:深度网络权重初始化的经典之作
Xavier 初始化:深度网络权重初始化的经典之作 发音:美 [zeɪvjər] n.泽维尔(男子名) 在深度学习的发展历程中,权重初始化对神经网络训练的成功至关重要。随机初始化的简单方法在浅层网络中尚可,但在深层…...
【量化策略】动量反转策略
【量化策略】动量反转策略 🚀量化软件开通 🚀量化实战教程 技术背景与应用场景 动量反转策略是一种基于市场行为分析的量化交易策略,它假设股票价格在经历一段时间的持续上涨或下跌后,会出现反转。这种策略适用于那些希望通过…...