我应该如何创建我的GUID?
问题描述:
我将把图像上传到系统,并且需要它们被非序列唯一ID引用。我读了一些关于GUID的内容,我想知道在PHP中创建一个最好的方法是什么。我应该md5()当前的时间戳记和盐,或将PHP的uniqueid(http://www.php.net/manual/en/function.uniqid.php)函数是否足够?我应该如何创建我的GUID?
谢谢!
答
编辑:
哎呀!我忘了我的这个古老的答案。为了澄清我的天真(符合下面的评论)所产生的混淆:MD5(就像它们本质上最有用的哈希)是而不是内射,所以它们的输出不保证对所有输入都是唯一的。
如果散列冲突是一个问题(在这种情况下,它们是),使用这种技术将需要在散列之后检查是否已经生成了相同的密钥。
由于uniqid使用当前时间以微秒为单位生成的GUID,几乎不存在,你永远遇到同样一个两次机会。
所以,如果你只是用它来制作独特的文件名,uniqid()就足够了。如果你想阻止用户猜测这个GUID,你也可以让它变得更加困难。
答
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;
}
}
我喜欢md5'ing它的想法:) – 2009-09-19 20:58:38
但是MD5没有按保持独特性。 – Gumbo 2009-09-19 21:02:42
如果您的md5已经是唯一的密钥,它将保持唯一。 – BraedenP 2009-09-19 21:03:51