Php 使用uniqid上载文件系统

Php 使用uniqid上载文件系统,php,file,Php,File,我想知道我是否对文件上传系统使用了uniqid功能, 我的意思是,有人上传我更改的每个文件的名称都是uniqidname 那么两个文件可能同名? 如果是,解决方案是什么? 我应该做: $uniq = uniqid(); while (file_exists($uniq)) $uniq = uniqid(); 谢谢你的帮助 那么两个文件可能同名 是的。因此,如果同时上载两个文件,它们可能具有相同的文件名 如果是,解决方案是什么 有很多解决办法。基本上,它们都归结为添加某种独特的字符串。例如,您可

我想知道我是否对文件上传系统使用了
uniqid
功能, 我的意思是,有人上传我更改的每个文件的名称都是
uniqid
name

那么两个文件可能同名? 如果是,解决方案是什么? 我应该做:

$uniq = uniqid();
while (file_exists($uniq)) $uniq = uniqid();
谢谢你的帮助

那么两个文件可能同名

是的。因此,如果同时上载两个文件,它们可能具有相同的文件名

如果是,解决方案是什么


有很多解决办法。基本上,它们都归结为添加某种独特的字符串。例如,您可以使用:
md5($filename.time())
(可能仍然存在冲突)或者更好的方法:
md5($filename.database\u insert\u id)
uniqid()
基于特定的微时间,因此使用它时很难获得重复的文件名。同时,这是基于系统时间的,可以让两个人同时上传文件(虽然不太可能),因此您也可以将用户名附加到文件名,因此,几乎不可能有任何文件具有双重名称。

您可以改进传递前缀和增加熵的字符串的唯一性。尝试这样做:

$prefix = {the original file name} + {the file size};
$fileName = uniqid($prefix, TRUE);

这样做可以利用两个不同的因素:客户机文件名和大小。两者的结合可以极大地增加返回字符串的唯一性。有关前缀和熵参数的更多详细信息,请参阅位于

的官方php文档,对于正常数量的文件来说,这似乎是一个不错的解决方案。这取决于系统的范围;上传大量非常小的文件将增加命中多个副本的风险,这将影响性能,但不会影响其他方面。您有16^13个可能的值(13个十六进制字符),这是一个惊人的4.5e15唯一ID。如果你把Nyquist速率考虑进去,在频繁循环并开始发现问题之前,你应该期望只有一半,或者最多大约2250000000000个文件。md5它的32个字符不是吗?uniqid()+$insert\u id如何?是的,
md5()
生成一个32个字符的字符串。是的,您可以使用
uniqid()
+
$insert\u id
。坦白地说,您可以只使用insert id。最后,您所要做的就是确保唯一性。您的数据库id应该是唯一的。