高並發 php uniqid 用md5生成不重復唯一標識符方案
uniqid() 函數基於以微秒計的當前時間,生成一個唯一的 ID。
uniqid(prefix,more_entropy)
prefix 可選。為 ID 規定前綴。如果兩個腳本恰好在相同的微秒生成 ID,該參數很有用。
more_entropy 可選。規定位於返回值末尾的更多的熵。
如果 prefix 參數為空,則返回的字符串有 13 個字符串長。如果 more_entropy 參數設置為 true,則是 23 個字符串長。
如果 more_entropy 參數設置為 true,則在返回值的末尾添加額外的熵(使用組合線形同余數生成程序),這樣可以結果的唯一性更好。
以字符串的形式返回唯一標識符。
提示和注釋:由於基於系統時間,通過該函數生成的 ID 不是最佳的。即使使用了第二個參數,也會重復,如需生成絕對唯一的 ID最好的方案是結合md5函數來生成唯一ID。
-----------------------------------------
1 //獲取唯一序列號 2 public static function generateNum() { 3 //strtoupper轉換成全大寫的 4 $charid = strtoupper(md5(uniqid(mt_rand(), true))); 5 $uuid = substr($charid, 0, 8).substr($charid, 8, 4).substr($charid,12, 4).substr($charid,16, 4).substr($charid,20,12); 6 return $uuid; 7 } 8 9 -------------------------------------------- 10 <?php 11 $units = array(); 12 for($i=0;$i<1000000;$i++){ 13 $units[] = md5(uniqid(md5(microtime(true)),true)); 14 } 15 $values = array_count_values($units); 16 $duplicates = []; 17 foreach($values as $k=>$v){ 18 if($v>1){ 19 $duplicates[$k]=$v; 20 } 21 } 22 //這種方法生成的唯一標識中沒有重復。 23 echo '<pre>'; 24 print_r($duplicates); 25 echo '</pre>'; 26 ?>