我将要将图像上传到系统,并且需要通过非顺序唯一ID来引用它们。我已经阅读了一些关于GUID的内容,我想知道在PHP中创建一个GUID的最佳方法是什么。我应该md5()当前的时间戳并加盐,或者PHP的uniqueid(http://www.php.net/manual/en/function.uniqid.php)函数是否足够?
谢谢!
答案 0 :(得分:20)
修改强>
糟糕!我忘记了我的这个古老的答案。为了澄清我的天真所产生的混淆(与下面的评论一致):MD5(就像它们本质上最有用的哈希)是不内射,因此它们的输出不能保证对所有输入都是唯一的
如果哈希冲突是一个问题(在这种情况下,它们是),使用此技术将需要在散列后检查是否已生成相同的密钥。
由于uniqid使用当前时间(以微秒为单位)来生成guid,因此几乎没有机会再次遇到同一个guid。
因此,如果您只是使用它来创建唯一的文件名,uniqid()就足够了。如果你想阻止用户猜测guid,你也可以把它变得更难和md5。
答案 1 :(得分:6)
GUID是微软的UUID版本。 PHP的uniqid是UUID的第4版。绝对够好。
答案 2 :(得分:2)
我也想创建用于调用.net api的guid,这个函数生成一个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;
}
}