PHP生成唯一ID之SnowFlake演算法詳解

2021-08-22 04:44:26 字數 1552 閱讀 5137

snowflake演算法是個啥?首先我來提出個問題,怎麼在分布式系統中生成唯一性id並保持該id大致自增?在twitter中這是最重要的業務場景,於是twitter推出了一種snowflake演算法。

前言:最近需要做一套cms系統,由於功能比較單一,而且要求靈活,所以放棄了wp這樣的成熟系統,自己做一套相對簡單一點的。文章的詳情頁url想要做成url偽靜態的格式即***.html 其中***考慮過直接用自增主鍵,但是感覺這樣有點暴露文章數量,有同學說可以把初始值設高一點,可是還是可以通過id差算出一段時間內的文章數量,所以需要一種可以生成唯一id的演算法。

考慮過的方法有

直接用時間戳,或者以此衍生的一系列方法

mysql自帶的uuid

以上兩種方法都可以查到就不多做解釋了

最終選擇了twittersnowflake演算法

這個演算法的好處很簡單可以在每秒產生約400w個不同的16位數字id(10進製)

原理很簡單

id由64bit組成

其中 第乙個bit空缺

41bit用於存放毫秒級時間戳

10bit用於存放機器id

12bit用於存放自增id

除了最高位bit標記為不可用以外,其餘三組bit佔位均可浮動,看具體的業務需求而定。預設情況下41bit的時間戳可以支援該演算法使用到2023年,10bit的工作機器id可以支援1023臺機器,序列號支援1毫秒產生4095個自增序列id。

下面是php原始碼

<?php

abstract class particle else {

$machineid = str_pad(decbin(self::$machineid), 10, "0", str_pad_left);

* sequence number - 12 bits - up to 4096 random numbers per machine

$random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", str_pad_left);

* pack

$base = $base.$machineid.$random;

* return unique time id no

return bindec($base);

public static function timefromparticle($particle) {

* return time

return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::epoch;

呼叫方法如下

particle::generateparticle($machineid);//生成id

particle::timefromparticle($particle);//反向計算時間戳

這裡我做了改良 如果機器id傳0 就會去掉這10bit 因為有些時候我們可能用不到這麼多id

php 生成唯一ID

function guid factor prefix suffix 生成因子 機器毫秒,使用者瀏覽器與作業系統資訊,使用者ip,隨機因子,及自定義 factor 因子 原理 自定義 factor 因子 例如可使用使用者 user id 模組標識 product,order.字首 prefix 可用...

php生成唯一id

網上查了下,有很多的方法 1 md5 time mt rand 1,1000000 這種方法有一定的概率會出現重複 2 php內建函式uniqid uniqid 函式基於以微秒計的當前時間,生成乙個唯一的 id.w3school參考手冊有一句話 由於基於系統時間,通過該函式生成的 id 不是最佳的。...

PHP生成唯一ID

php自帶乙個生成唯一id的方法uniqid 我們還可以傳入引數,這個引數作為生成的唯一id的字首,該方法生成的id是基於當前時間微秒數生成的id,保證了id的唯一性。示例 prefix itbsl 說明 string uniqud string prefix bool more entropy f...