我应该如何创建我的GUID?

问题描述:

我将把图像上传到系统,并且需要它们被非序列唯一ID引用。我读了一些关于GUID的内容,我想知道在PHP中创建一个最好的方法是什么。我应该md5()当前的时间戳记和盐,或将PHP的uniqueid(http://www.php.net/manual/en/function.uniqid.php)函数是否足够?我应该如何创建我的GUID?

谢谢!

编辑:

哎呀!我忘了我的这个古老的答案。为了澄清我的天真(符合下面的评论)所产生的混淆: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

GUID是Microsoft的UUID版本。 PHP的uniqid是UUID的第4版。绝对够好。

我也想创建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; 
    } 
}