我该如何创建GUID?

时间:2009-09-19 20:51:54

标签: php guid

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

谢谢!

3 个答案:

答案 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;
    }
}