2009-09-19 85 views

回答

19

編輯:

哎呀!我忘了我的這個古老的答案。爲了澄清我的天真(符合下面的評論)所產生的混淆:MD5(就像它們本質上最有用的哈希)是而不是內射,所以它們的輸出不保證對所有輸入都是唯一的。

如果散列衝突是一個問題(在這種情況下,它們是),使用這種技術將需要在散列之後檢查是否已經生成了相同的密鑰。


由於uniqid使用當前時間以微秒爲單位生成的GUID,幾乎不存在,你永遠遇到同樣一個兩次機會。

所以,如果你只是用它來製作獨特的文件名,uniqid()就足夠了。如果你想阻止用戶猜測這個GUID,你也可以讓它變得更加困難。

+1

我喜歡md5'ing它的想法:) – 2009-09-19 20:58:38

+4

但是MD5沒有按保持獨特性。 – Gumbo 2009-09-19 21:02:42

+2

如果您的md5已經是唯一的密鑰,它將保持唯一。 – BraedenP 2009-09-19 21:03:51

6

GUID是Microsoft的UUID版本。 PHP的uniqid是UUID的第4版。絕對夠好。

2

我也想創建GUID調用.NET API而這個函數生成的GUID格式的關鍵,它爲我工作

function generateGuid($include_braces = false) { 
    if (function_exists('com_create_guid')) { 
     if ($include_braces === true) { 
      return com_create_guid(); 
     } else { 
      return substr(com_create_guid(), 1, 36); 
     } 
    } else { 
     mt_srand((double) microtime() * 10000); 
     $charid = strtoupper(md5(uniqid(rand(), true))); 

     $guid = substr($charid, 0, 8) . '-' . 
       substr($charid, 8, 4) . '-' . 
       substr($charid, 12, 4) . '-' . 
       substr($charid, 16, 4) . '-' . 
       substr($charid, 20, 12); 

     if ($include_braces) { 
      $guid = '{' . $guid . '}'; 
     } 

     return $guid; 
    } 
}