在PHP中生成唯一ID

15

我正在尝试使用PHP生成一个唯一的ID,以便在文件系统中存储用户上传的内容时不会发生冲突。目前,以下代码片段负责生成UID:

$id = tempnam (".", "");
unlink($id);
$id = substr($id, 2);

这段代码很丑陋:它在文件系统上创建一个临时文件,然后删除它,只保留所生成字符串的相关部分。

有没有更好的方法来做到这一点,最好不需要任何外部依赖?

非常感谢!

3个回答

19
string uniqid ([ string $prefix [, bool $more_entropy ]] )

获取基于当前时间(微秒)的带前缀的唯一标识符。

USAGE: $id = uniqid(rand(), true);

用 MD5 进行哈希会不会使生成冲突的可能性更大? - nickf
1
我正要说这个。Sha1的碰撞较少,但哈希中肯定存在这个问题。记住:唯一ID越长,你对其进行“随机”操作的次数越多,碰撞的概率就越低。 - Robert Elwell
其实,我理解你的意思了,你需要一个ID而不是标记值...已编辑。 - Xenph Yan

9

由于uniqid()和rand()函数都基于当前时间,而且两个调用之间时间变化很小,因此rand()添加的熵几乎没有意义。

只要使用more_entropy选项,您就不应该在单个服务器上出现碰撞。如果使用集群,请确保在服务器之间包含不同的前缀。


5

在大多数实际情况下,您需要使用uniqid()。

您可以通过在其后添加一个大的随机数来使其更加“独特”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接