雪花演算法
一:概述
- SnowFlake 演演算法
- 是 Twitter 開源的分散式 id 生成演演算法。
- 應用場景
- 高效能的產生不重複 ID,支援叢集的橫向擴充套件。
二:原理
- 其核心思想就是:
- 使用一個 64 bit 的 long 型的數字作為全域性獨立 id。
- 在分散式系統中的應用十分廣泛,且 ID 引入了時間戳,基本上保持自增的。
- 產生公式
- | 0 (最高位預留) | 時間戳 (41 位) | 機器 ID (10 位) | 隨機序列 (12 位) |
- 形成 64 位 bit
三:實現解析
- 0 (最高位預留)
- 因為二進位制裡第一個 bit 為如果是 1,那麼都是負數,但是我們生成的 id 都是正數,所以第一個 bit 統一都是 0。
- 時間戳 (41 位)
- 41 bits 的 Timestamp,每次要生成一個新 ID 的時候,都會獲取一下當前的 Timestamp, 保證每個 timestamp 都是不同的。
- 機器 ID (10 位)
- 10 bits 的機器號,在 ID 分配 Worker 啟動的時候,從一個 叢集獲取 (保證所有的 Worker 不會有重複的機器號)。
- 隨機序列 (12 位)
- 12 bit 隨機數。
- 組成 64 位 bits,成為 10 進位制的 16 位 unique Id
四:程式碼簡單實現
<?php /** * 雪花演演算法 * 其核心思想就是: * 使用一個 64 bit 的 long 型的數字作為全域性獨立 id。 * 在分散式系統中的應用十分廣泛,且ID 引入了時間戳,基本上保持自增的。 * 產生公式 * | 0(最高位預留) | 時間戳(41位) | 機器ID(10位) | 隨機序列(12位) | */ class IdCreate { const max12bit = 4095; public static function createOnlyId() { // 獲取微秒時間戳(42位),擷取並轉化為 41位二進位制 $microtime = decbin(floor(microtime(true) * 1000)); // 10bit 的機器號,由叢集產出 $machineId = self::machine(); // 12bit 的隨機數 $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT); // 拼接 $base = '0' . $microtime . $machineId . $random; // 十進位制 返回 return bindec($base); } /** * 叢集 * @param int $machineId * @return string */ public static function machine($machineId = 0) { return str_pad($machineId, 10, "0", STR_PAD_LEFT); } } $cast_id = IdCreate::createOnlyId(); var_dump($cast_id);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026630/viewspace-2945122/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 開源一個新的雪花演算法(雪花漂移)演算法
- 雪花演算法和UUID演算法UI
- Go 實現雪花演算法Go演算法
- 雪花演算法的實現演算法
- 開源一個比雪花演算法更好用的ID生成演算法(雪花漂移)演算法
- 分散式雪花演算法獲取id分散式演算法
- Twitter雪花演算法SnowFlake演算法的java實現演算法Java
- MyBatis-Plus雪花演算法實現原始碼解析MyBatis演算法原始碼
- 基於雪花演算法的 PHP ID 生成器演算法PHP
- 雪花演算法【分散式ID問題】【劉新宇】演算法分散式
- 分散式唯一ID解決方案-雪花演算法分散式演算法
- 雪花演算法ID在前端丟失精度解決方案演算法前端
- 面試官:講講雪花演算法,越詳細越好面試演算法
- 基於雪花演算法生成分散式ID(Java版)演算法分散式Java
- Snowflake(雪花演算法),什麼情況下會衝突?演算法
- DefaultIdentifierGenerator 雪花演算法 生成 重複 id 解決辦法IDE演算法
- 雪花演算法對System.currentTimeMillis()最佳化真的有用麼?演算法
- Java使用雪花演算法實現生成全域性唯一idJava演算法
- 雪花演算法及微服務叢集唯一ID解決方案演算法微服務
- 【演算法】友誼與雪花的舞動,指令碼解析器原理演算法指令碼
- 分散式系統全域性唯一Id(SnowFlake)雪花演算法實現分散式演算法
- ACCESS 模擬雪花ID
- 關於使用MyBatisPlus後id變一長串(雪花演算法)的踩坑MyBatis演算法
- 完美解決方案-雪花演算法ID到前端之後精度丟失問題演算法前端
- 分散式唯一ID生成方案選型!詳細解析雪花演算法Snowflake分散式演算法
- JavaScript 雪花飄舞效果詳解JavaScript
- Golang雜談-gorm整合雪花idGolangORM
- 全域性唯一ID生成常見的幾種方式和twitter/snowflake(雪花演算法)解析演算法
- 如何在Java服務中實現分散式ID生成:雪花演算法與UUID的對比Java分散式演算法UI
- 聖誕雪花紛飛自定義ViewView
- ShardingSphere-proxy-5.0.0企業級分庫分表、讀寫分離、負載均衡、雪花演算法、取模演算法整合(八)負載演算法
- Twitter的分散式雪花演算法 SnowFlake 每秒自增生成26個萬個可排序的ID (Java版)分散式演算法排序Java
- html5 飄雪花動畫(增加背景音樂)HTML動畫
- Laravel 自動轉換長整型雪花 ID 為字串Laravel字串
- ShardingSphere-proxy-5.0.0分散式雪花ID生成(三)分散式
- js純程式碼為網站站點新增雪花飄落效果JS網站
- [公告] “雪花”創作激勵計劃,3月1日正式開啟!
- 資料倉儲 - 星座模型、星型模型和雪花模型的介紹模型