如果同时运行mt_rand(),结果是否相同?

时间:2016-11-07 07:38:14

标签: php random

我正在编写一个PHP脚本来处理文件上传到服务器。为了防止在存在同名文件时进行覆盖,程序会将每个上传的文件重命名为当前时间戳。

然而,这还不够。在高峰时段,可能会有同一时间上传的文件。为了确保上传的文件具有不同的文件名,我想在时间戳的末尾添加一个随机数。

然后,我从the official PHP page on srand()

阅读
  

注意:无需为随机数生成器播种   srand()或mt_srand(),因为这是自动完成的。

我猜他们正在使用srand()的时间戳。如果在同一秒上传2个文件,那么srand()的时间戳,随机结果是否相同?如果是,有没有办法确保名称不重复,即使它们是在同一时间上传的?

3 个答案:

答案 0 :(得分:2)

PHP也有一些更好的随机函数,如random_bytes()openssl_random_pseudo_bytes()。这些将返回保证的唯一值。将其传递给bin2hex(),您就可以了!

答案 1 :(得分:1)

这是生成种子的代码

#define GENERATE_SEED() (((zend_long) (time(0) * GetCurrentProcessId())) ^ ((zend_long) (1000000.0 * php_combined_lcg())))
#else
#define GENERATE_SEED() (((zend_long) (time(0) * getpid())) ^ ((zend_long) (1000000.0 * php_combined_lcg())))

https://github.com/php/php-src/blob/6053987bc27e8dede37f437193a5cad448f99bce/ext/standard/php_rand.h#L69

所以它是时间戳和进程ID以及伪随机

的组合

https://github.com/php/php-src/blob/6053987bc27e8dede37f437193a5cad448f99bce/ext/standard/lcg.c#L45

  

combinedLCG()返回(0,1)范围内的伪随机数    该功能将两个CG组合为周期为
   2 ^ 31 - 85和2 ^ 31 - 249.此功能的期间
   等于两个素数的乘积。

所以,我会说你可以放心,他们不会匹配。

答案 2 :(得分:1)

不,seed将用于随机数范围,而不是单个数字。比你将呈现随机生成范围的单个数字。仍有可能会得到相同的伪随机数。

尝试添加类似md5(time().$filename.'.'.$extension)的内容。