国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP生成唯一ID之SnowFlake算法

2024-05-04 23:53:45
字體:
來源:轉載
供稿:網友

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

考慮過的方法有

  1. 直接用時間戳,或者以此衍生的一系列方法
  2. 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源碼

<?phpnamespace App/Services;abstract class Particle {  const EPOCH = 1479533469598;  const max12bit = 4095;  const max41bit = 1099511627775;  static $machineId = null;  public static function machineId($mId = 0) {    self::$machineId = $mId;  }  public static function generateParticle() {    /*    * Time - 42 bits    */    $time = floor(microtime(true) * 1000);    /*    * Substract custom epoch from current time    */    $time -= self::EPOCH;    /*    * Create a base and add time to it    */    $base = decbin(self::max41bit + $time);    /*    * Configured machine id - 10 bits - up to 1024 machines    */    if(!self::$machineId) {      $machineid = self::$machineId;    } 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);//生成IDParticle::timeFromParticle($particle);//反向計算時間戳

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


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 海兴县| 汉阴县| 什邡市| 金堂县| 隆安县| 浠水县| 赞皇县| 五台县| 乐山市| 哈密市| 宁晋县| 闵行区| 布尔津县| 大埔县| 衡山县| 汉川市| 陇西县| 平南县| 宁化县| 龙胜| 潮安县| 托里县| 林州市| 铜鼓县| 广州市| 北宁市| 昭平县| 永德县| 辽阳市| 沙田区| 宿松县| 朝阳县| 靖州| 宝清县| 阳高县| 台中县| 泗水县| 读书| 嘉荫县| 响水县| 来凤县|