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