摘要:使用算法生成唯一前言最近需要做一套系統,由于功能比較單一,而且要求靈活,所以放棄了這樣的成熟系統,自己做一套相對簡單一點的。默認情況下的時間戳可以支持該算法使用到年,的工作機器可以支持臺機器,序列號支持毫秒產生個自增序列。
使用SnowFlake算法生成唯一ID
前言:最近需要做一套CMS系統,由于功能比較單一,而且要求靈活,所以放棄了WP這樣的成熟系統,自己做一套相對簡單一點的。文章的詳情頁URL想要做成url偽靜態的格式即xxx.html 其中xxx考慮過直接用自增主鍵,但是感覺這樣有點暴露文章數量,有同學說可以把初始值設高一點,可是還是可以通過ID差算出一段時間內的文章數量,所以需要一種可以生成唯一ID的算法。
考慮過的方法有
直接用時間戳,或者以此衍生的一系列方法
Mysql自帶的uuid
以上兩種方法都可以查到就不多做解釋了
最終選擇了Twitter的SnowFlake算法
這個算法的好處很簡單可以在每秒產生約400W個不同的16位數字ID(10進制)
原理很簡單
ID由64bit組成
其中 第一個bit空缺
41bit用于存放毫秒級時間戳
10bit用于存放機器id
12bit用于存放自增ID
除了最高位bit標記為不可用以外,其余三組bit占位均可浮動,看具體的業務需求而定。默認情況下41bit的時間戳可以支持該算法使用到2082年,10bit的工作機器id可以支持1023臺機器,序列號支持1毫秒產生4095個自增序列id。
下面是PHP源碼
調用方法如下
Particle::generateParticle($machineId);//生成ID
Particle::timeFromParticle($particle);//反向計算時間戳
這里我做了改良 如果機器ID傳0 就會去掉這10bit 因為有些時候我們可能用不到這么多ID
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22155.html
摘要:使用生成很多都是在分布式場景下使用,我看了下網上有其中有幾篇實現的都沒有考慮到線程安全。現在有了的鎖和協程的加持,對于我們開發線程安全和高并發模擬還是很方便的,這里用結合來學習下實現最簡單的好久沒寫,感覺沒有真寫不了了。 Twitter 的 snowflake 在分布式生成唯一 UUID 應用還是蠻廣泛的,基于 snowflake 的一些變種的算法網上也有不少。使用 snowflake...
摘要:所以就誕生了這個項目,以下為線程安全版本和非線程安全版本差別。非線程安全版本線程安全版本安裝示例注意區間在超出范圍將會報告一個致命錯誤協議版權歸屬于請遵守協議 php_snowflake 項目地址 什么是 php_snowflake? 推特分布式id生成算法SnowFlake PHP 的實現 需求 PHP >= 5.6 (5.5以下的自行測試) 不支持windows 說明 純PH...
摘要:出于以上兩個原因,我們需要自己的發號器來產生。與此同時,為了保證執行,具有原子性,我們使用來進行實現。由于能力和水平有限,難免會有紕漏,希望及時指出。參考文章分布式生成器實現上實現原理 1、為什么要實現發號器 很多地方我們都需要一個全局唯一的編號,也就是uuid。舉一個常見的場景,電商系統產生訂單的時候,需要有一個對應的訂單編號。在composer上我們也可以看到有很多可以產生uuid...
閱讀 2088·2021-11-24 09:39
閱讀 1551·2021-10-11 10:59
閱讀 2499·2021-09-24 10:28
閱讀 3376·2021-09-08 09:45
閱讀 1269·2021-09-07 10:06
閱讀 1667·2019-08-30 15:53
閱讀 2061·2019-08-30 15:53
閱讀 1420·2019-08-30 15:53