首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[分享]🌟✨【PHP雪花算法生成ID】✨🌟

发布于 2024-12-10 08:58:32
0
112

嘿小伙伴们👋🏻,今天要跟大家安利一个超级实用的编程小知识:如何用PHP实现雪花算法来生成独一无二的ID🎢!听起来是不是很高大上呀?别担心,其实操作起来一点也不复杂哦~ 跟着我一起来学习一下吧👩‍💻!首...

嘿小伙伴们👋🏻,今天要跟大家安利一个超级实用的编程小知识:如何用PHP实现雪花算法来生成独一无二的ID🎢!听起来是不是很高大上呀?别担心,其实操作起来一点也不复杂哦~ 跟着我一起来学习一下吧👩‍💻!

首先呢,咱们得知道什么是“雪花算法”。简单来说,它是由Twitter开发的一种分布式ID生成方案,能够保证在不同机器上同时生成不重复的长整型数字序列。就像每一片雪花都是独一无二的一样美丽❄️💫,每个通过此算法产出的ID也是独一无二哒~

那么具体怎么做呢?别急,这就教你一步步搭建属于自己的PHP版雪花算法框架💪🏼:

  1. 环境准备:确保你的电脑上已经安装了PHP环境。如果没有的话,可以先去官网下载最新版安装包进行安装哟🛠️。

  2. 编写代码:接下来就是见证奇迹的时刻啦!打开你喜欢的IDE(比如VSCode或Sublime Text),新建一个php文件,命名为snowflake_id.php,然后按照下面的示例填写内容:

    <?php
    class Snowflake {
        private $twepoch = 1288834974657; // 开始时间戳 (2010-11-04)
        private $datacenterIdBits = 5;    // 数据中心ID位数
        private $workerIdBits = 5;       // 机器ID位数
        private $maxDatacenterId = -1 ^ (-1 << $datacenterIdBits);
        private $maxWorkerId = -1 ^ (-1 << $workerIdBits);
        private $sequenceBits = 12;      // 序列号位数
    
        private $workerIdShift = $sequenceBits;
        private $datacenterIdShift = $sequenceBits + $workerIdBits;
        private $timestampLeftShift = $sequenceBits + $workerIdBits + $datacenterIdBits;
    
        private $sequenceMask = -1 ^ (-1 << $sequenceBits);
    
        private $lastTimestamp = -1;
        private $sequence = 0;
        private $datacenterId;
        private $workerId;
    
        public function __construct($datacenterId, $workerId) {
            if ($datacenterId > $this->maxDatacenterId || $datacenterId < 0) {
                throw new Exception("DataCenter Id can't be greater than {} or less than 0", $this->maxDatacenterId);
            }
            if ($workerId > $this->maxWorkerId || $workerId < 0) {
                throw new Exception("Worker Id can't be greater than {} or less than 0", $this->maxWorkerId);
            }
            $this->datacenterId = $datacenterId;
            $this->workerId = $workerId;
        }
    
        public function getNextId() {
            $timestamp = $this->timeGen();
    
            if ($timestamp < $this->lastTimestamp) {
                throw new Exception('Clock moved backwards. Refusing to generate id');
            }
    
            if ($this->lastTimestamp == $timestamp) {
                $this->sequence = ($this->sequence + 1) & $this->sequenceMask;
                if ($this->sequence == 0) {
                    $timestamp = $this->tilNextMillis($this->lastTimestamp);
                }
            } else {
                $this->sequence = 0;
            }
    
            $this->lastTimestamp = $timestamp;
            return ($this->sequence << $this->sequenceBits | $this->datacenterId << $this->datacenterIdShift | $this->workerId << $this->workerIdShift | $timestamp << $this->timestampLeftShift);
        }
    
        protected function tilNextMillis($lastTimestamp) {
            $timestamp = $this->timeGen();
            while ($timestamp <= $lastTimestamp) {
                $timestamp = $this->timeGen();
            }
            return $timestamp;
        }
    
        protected function timeGen() {
            return floor(microtime(true) * 1000);
        }
    }
  3. 运行测试:保存好文件之后,在命令行中使用php snowflake_id.php命令来执行脚本试试看吧!如果一切正常的话,你应该可以看到一串长长的数字被打印出来啦!这就是你的第一个由PHP+雪花算法生成的独特ID哦🎉🥳!

通过上面简单的几步操作,你就掌握了使用PHP语言实现雪花算法的方法啦!是不是觉得还挺有趣的呢?如果你对这个话题感兴趣或者有任何疑问的话,欢迎留言交流哦💬~希望今天的分享对你有所帮助,记得给我点赞+关注哦💖🌈!

评论
一个月内的热帖推荐
久久在线
Lv.1普通用户

551

帖子

21

小组

2050

积分

赞助商广告
站长交流