PHP在同一时间生成相同的随机数(秒)

PHP在同一时间生成相同的随机数(秒),php,Php,我在上传文件时在PHP脚本中使用了随机数函数。因为我想避免覆盖同名文件。下面是上传文件时使用的脚本药剂 $filename = rand(0,100000).strtolower($_FILES['file']['name']); $dir="/file/upload/directory/".$filename; move_uploaded_file($_FILES["user_file"]["tmp_name"], $dir); 此应用程序预计将有大量并发用户。因此,QA通过应用高并发访问,

我在上传文件时在PHP脚本中使用了随机数函数。因为我想避免覆盖同名文件。下面是上传文件时使用的脚本药剂

$filename = rand(0,100000).strtolower($_FILES['file']['name']);
$dir="/file/upload/directory/".$filename;
move_uploaded_file($_FILES["user_file"]["tmp_name"], $dir);
此应用程序预计将有大量并发用户。因此,QA通过应用高并发访问,使用不同的自动化工具测试此应用程序。这一点随机数似乎在同一秒内产生相同的值

然后我们对随机数分别进行了测试,在同一时间对相同的随机数进行了清晰的识别

在网上搜索时,一些帖子建议使用
mt_rand()
,但在毫秒级上仍然是一样的


在PHP中是否有任何方法可以以与时间无关的方式生成随机数?

随机数是随时间生成的。但是对于这个特殊的问题,我们需要编写几行代码。如果我们检查文件是否存在,并对文件名应用增量编号,那么这将是一个固定的解决方案。代码可以如下所示

$filename = strtolower($_FILES['file']['name']);
$dir="/file/upload/directory/";
$i = 1;

while(is_file($dir . $i . $filename))
{
   $i++;
}

move_uploaded_file($_FILES["user_file"]["tmp_name"], $dir . $i . $filename);

即使循环效率很低。这将确保不会发生文件覆盖。

随机性不是保证文件名唯一的有效方法。由于生日悖论,您将很快遇到冲突。您可以对日期进行哈希,并将其设置为文件名,这样其他文件的名称就不会相同。如果您想要唯一的文件名,请使用
md5_file()
对文件进行哈希,并将其设置为文件名。或者至少使用前5-10个字符。很可能你不会撞到它。这样做的好处是,如果你对一个文件使用相同的哈希,它很可能是同一个文件。假设你将信息存储在数据库中,你可以使用自动递增ID作为文件名。顺便说一下,在我将其用作文件名之前,我还会对
$\u文件['file']['name']
进行一些验证。谢谢。这是一个修复方案,即使不应用随机命名。