湛江专业建站推荐,wordpress 文章列表顺序,内网建设网站外网访问,网站外包 博客引言
雪花算法是Twitter开源的分布式ID生成算法#xff0c;可以产生64位的ID。其中第一位是固定的正数标识#xff0c;41位用于存储时间戳#xff0c;剩下的为机器ID和序列号。通过时间戳、机器ID和序列号的组合#xff0c;确保每个ID都是唯一的。
PHP代码
1、定义雪花算…引言
雪花算法是Twitter开源的分布式ID生成算法可以产生64位的ID。其中第一位是固定的正数标识41位用于存储时间戳剩下的为机器ID和序列号。通过时间戳、机器ID和序列号的组合确保每个ID都是唯一的。
PHP代码
1、定义雪花算法类
class Snowflake
{private int $datacenterId; // 数据中心IDprivate int $machineId; // 机器IDprivate int $sequence 0; // 序列号private int $lastTimestamp -1; // 上一个时间戳private const DATA_CENTER_ID_BITS 5; // 数据中心ID所占位数private const MACHINE_ID_BITS 5; // 机器ID所占位数private const SEQUENCE_BITS 12; // 序列号所占位数private const MAX_DATA_CENTER_ID -1 ^ (-1 self::DATA_CENTER_ID_BITS);private const MAX_MACHINE_ID -1 ^ (-1 self::MACHINE_ID_BITS);private const TIMESTAMP_LEFT_SHIFT self::SEQUENCE_BITS self::MACHINE_ID_BITS self::DATA_CENTER_ID_BITS;private const SEQUENCE_LEFT_SHIFT self::MACHINE_ID_BITS self::DATA_CENTER_ID_BITS;private int $epoch; // 起始时间戳public function __construct(int $datacenterId, int $machineId){if ($datacenterId 0 || $datacenterId self::MAX_DATA_CENTER_ID) {throw new Exception(数据中心ID超出范围);}if ($machineId 0 || $machineId self::MAX_MACHINE_ID) {throw new Exception(机器ID超出范围);}$this-datacenterId $datacenterId;$this-machineId $machineId;$this-epoch 1609430400000; // 自定义起始时间例如2021年1月1日}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;return (($timestamp - $this-epoch) self::TIMESTAMP_LEFT_SHIFT) |($this-datacenterId self::SEQUENCE_LEFT_SHIFT) |($this-machineId self::SEQUENCE_BITS) |$this-sequence;}private function waitNextMillis(int $lastTimestamp): int{$timestamp $this-currentTimeMillis();while ($timestamp $lastTimestamp) {$timestamp $this-currentTimeMillis();}return $timestamp;}private function currentTimeMillis(): int{return (int)(microtime(true) * 1000);}
}2、创建实例生成ID
// 创建雪花算法实例
$datacenterId 1; // 数据中心ID
$machineId 1; // 机器ID
$snowflake new Snowflake($datacenterId, $machineId);// 生成用户ID的示例
for ($i 0; $i 10; $i) {$userId $snowflake-nextId();echo 生成的用户ID: $userId.br/;
}3、查看生成结果
生成的用户ID: 507485100926047232
生成的用户ID: 507485100926047233
生成的用户ID: 507485100926047234
生成的用户ID: 507485100926047235
生成的用户ID: 507485100926047236
生成的用户ID: 507485100926047237
生成的用户ID: 507485100926047238
生成的用户ID: 507485100926047239
生成的用户ID: 507485100926047240
生成的用户ID: 507485100926047241结论
这段代码是一个比较完整的雪花算法实现能够在分布式系统中生成高效、唯一的ID。通过合理的位移和位数分配确保了在高并发情况下生成的ID也不会重复。
实际部署中只需修改$datacenterId 1; // 数据中心ID 以及 $machineId 1; // 机器ID即可实现分布式生成不重复的ID。