php UUID &分佈式生成用不重複的隨機數方法

UUID(Universally Unique Identifier),通用惟一識別碼。
UUID是指在一臺機器上生成的數字,它保證對在同一時空中的全部機器都是惟一的php

UUID 由如下幾個部分組成:
1)當前日期和時間
2)時鐘序列
3)全局惟一的IEEE機器識別號,若是有網卡,從網卡MAC地址得到,沒有網卡以其餘方式得到。redis

 

生成 uuid:算法

public function create_guid($namespace = '') {
        static $guid = '';
        $uid = uniqid("", true);
        $data = $namespace;
        $data .= $_SERVER['REQUEST_TIME'];
        $data .= $_SERVER['HTTP_USER_AGENT'];
        $data .= $_SERVER['LOCAL_ADDR'];
        $data .= $_SERVER['LOCAL_PORT'];
        $data .= $_SERVER['REMOTE_ADDR'];
        $data .= $_SERVER['REMOTE_PORT'];
        $hash = strtoupper(hash('md5', $uid . $guid . md5($data)));
        $guid = '{' .
            substr($hash, 0, 8) .
            '-' .
            substr($hash, 8, 4) .
            '-' .
            substr($hash, 12, 4) .
            '-' .
            substr($hash, 16, 4) .
            '-' .
            substr($hash, 20, 12) .
            '}';
        return $guid;
    }

 

 

生成 logid:根據時序生成的 id數據庫

public static function logid(){
        $arr = gettimeofday();
        $aa = ($arr['sec']*100000 + $arr['usec']/10) &  0x7FFFFFFF;
        $logId = ((($arr['sec']*100000 + $arr['usec']/10) & 0x7FFFFFFF) | 0x80000000);
       return $logId

    }

snowflake:併發

twitter在把存儲系統從MySQL遷移到Cassandra的過程當中因爲Cassandra沒有順序ID生成機制,因而本身開發了一套全局惟一ID生成的服務:snowflake。其核心思想是:一個long型的ID,使用其中41bit做爲毫秒數,10bit做爲機器編號,12bit做爲毫秒內序列號。 運維

 

 

總結

算法高併發

優勢ui

缺點spa

適用場景code

auto_increment

數據庫本身實現,使用方便

存在單點問題,且有寫入瓶頸

業務體量較小,併發數小,絕對遞增

uuid 本地生成時效性高 須要獨立部署和維護,string類型作索引查詢效率低,極低機率出現重複 高併發、趨勢遞增
snowflake 本地生成時效性高 須要獨立部署和維護 高併發、趨勢遞增
redis incr 實現靈活、簡單 須要一次redis調用 併發要求不高,趨勢遞增
idalloc 內部維護服務 須要獨立部署和運維 高併發,趨勢遞增
相關文章
相關標籤/搜索