1. 程式人生 > 實用技巧 >php雪花演算法實現

php雪花演算法實現

<?php
/**
 *  分散式 id 生成類     組成: <毫秒級時間戳+機器id+序列號>
 *  預設情況下41bit的時間戳可以支援該演算法使用到2082年,10bit的工作機器id可以支援1023臺機器,序列號支援1毫秒產生4095個自增序列id
 *  @author zhangqi
 */
class IdCreate
{
    const EPOCH = 1479533469598;    //開始時間,固定一個小於當前時間的毫秒數
    const max12bit = 4095;
    const max41bit = 1099511627775;

    static
$machineId = null; // 機器id public static function machineId($mId = 0) { self::$machineId = $mId; } public static function createOnlyId() { // 時間戳 42位元組 $time = floor(microtime(true) * 1000); // 當前時間 與 開始時間 差值 $time -= self::EPOCH; // 二進位制的 毫秒級時間戳
$base = decbin(self::max41bit + $time); // 機器id 10 位元組 if(!self::$machineId) { $machineid = self::$machineId; } else { $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT); } // 序列數 12位元組 $random
= str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT); // 拼接 $base = $base.$machineid.$random; // 轉化為 十進位制 返回 return bindec($base); } } IdCreate::machineId("1");//機器編號 echo IdCreate::createOnlyId();//分散式id ?>