<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 介紹 在分布式系統中,生成全局唯一的ID是一項常見的需求。Snowflake是Twitter開源的一種分布式ID生成算法,它可以在分布式環境下生成唯一的、趨勢遞增的ID,且不依賴于中央服務器。本文將介紹Snowflake算法的原理,并使用PHP實現一個簡單的Snowflake生成器。 ![](https://img.kancloud.cn/77/8e/778e87f42a26d7d926781a5e31b16af8_1694x878.png) ## 雪花算法結構 > Snowflake算法生成的ID由64位組成,其中各部分的位數如下所示: ![](https://img.kancloud.cn/7f/26/7f26c2127cdc8c884d0010ac1689c8f3_603x135.png) ``` 1位符號位 | 41位時間戳 | 10位工作機器ID | 12位序列號 ``` 1. **符號位**:始終為0,保證生成的ID為正整數。因為二進制里第一個 bit 為如果是 1,那么都是負數,但是我們生成的 id 都是正數,所以第一個 bit 統一都是 0。 2. **時間戳**:使用41位來表示當前時間戳,精確到毫秒級,可以使用69年。41 bit 可以表示的數字多達 2^41 - 1,也就是可以標識 2 ^ 41 - 1 個毫秒值,換算成年就是表示 69 年的時間。 3. **工作機器ID**:用于區分不同的工作節點,可以分配的工作機器ID范圍為0~1023。但是 10 bit 里 5 個 bit 代表機房 id,5 個 bit 代表機器 id。意思就是最多代表 2 ^ 5 個機房(32 個機房),每個機房里可以代表 2 ^ 5 個機器(32 臺機器),這里可以隨意拆分,比如拿出4位標識業務號,其他6位作為機器號。可以隨意組合。 4. **序列號**:用于解決同一毫秒內并發生成多個ID的沖突問題,可以支持每毫秒最多生成4096個ID。12 bit 可以代表的最大正整數是 2 ^ 12 - 1 = 4096,也就是說可以用這個 12 bit 代表的數字來區分同一個毫秒內的 4096 個不同的 id。也就是同一毫秒內同一臺機器所生成的最大ID數量為4096 ## 安裝 ``` composer require godruoyi/php-snowflake -vvv ``` ## 簡單使用 ``` <?php /** * @desc snowflake * @author Tinywan(ShaoBo Wan) * @date 2024/8/14 22:45 */ require '../vendor/autoload.php'; $snowflake = new \Godruoyi\Snowflake\Snowflake; echo $snowflake->id() . PHP_EOL; ``` 執行輸出 ``` 663985260597348711 ``` **指定數據中心ID及機器ID** ``` $datacenterId = time(); $workerId = '1000000000000001'; $snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId); echo $snowflake->id() . PHP_EOL; ``` 執行輸出 ``` 663986323404837079 ``` **指定開始時間** ``` $snowflake = new \Godruoyi\Snowflake\Snowflake; $snowflake->setStartTimeStamp(strtotime('2020-08-15')*1000); echo $snowflake->id() . PHP_EOL; ``` 執行輸出 ``` 528938994126294755 ``` ## 高級用法 #### 在 Laravel 中使用 可通過下面的方式快速集成到 Laravel 中 ``` // App\Providers\AppServiceProvider use Godruoyi\Snowflake\Snowflake; use Godruoyi\Snowflake\LaravelSequenceResolver; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { $this->app->singleton('snowflake', function ($app) { return (new Snowflake()) ->setStartTimeStamp(strtotime('2019-10-10')*1000) ->setSequenceResolver(new LaravelSequenceResolver($app->get('cache.store'))); }); } } } ``` #### 自定義序列號解決器 你可以通過實現 `Godruoyi\\Snowflake\\SequenceResolver` 接口來自定義序列號解決器。 ``` class YourSequence implements SequenceResolver { /** * {@inheritdoc} */ public function sequence(int $currentTime) { // Just test. return mt_rand(0, 1); } } // usage $snowflake->setSequenceResolver(new YourSequence); $snowflake->id(); ``` 你也可以直接使用閉包: ``` $snowflake = new \Godruoyi\Snowflake\Snowflake; $snowflake->setSequenceResolver(function ($currentTime) { static $lastTime; static $sequence; if ($lastTime == $currentTime) { ++$sequence; } else { $sequence = 0; } $lastTime = $currentTime; return $sequence; })->id(); ``` ## 小結 本文介紹了Snowflake算法的原理,并使用PHP實現了一個簡單的Snowflake生成器。Snowflake算法可以在分布式系統中生成唯一的、趨勢遞增的ID,并且不依賴于中央服務器。 在實際應用中,我們可以將Snowflake生成器集成到分布式系統中,用于生成全局唯一的ID,滿足分布式環境下的唯一ID需求。希望本文的介紹能夠幫助讀者了解Snowflake算法的實現原理,并在實際開發中使用Snowflake生成器生成分布式唯一ID。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看