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


If mt_rand() is run at the same moment, will the result be the same?

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

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

然后,我从PHP官方页面上读取了srand()

注意:不需要为随机数生成器提供种子Srand()或mt_srand(),因为这是自动完成的。

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

这是生成种子的代码

#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给

combinedLCG()返回一个范围为(0,1)的伪随机数。
函数将周期为
的两个cg组合在一起2^31 - 85和2^31 - 249。函数
的周期等于两个素数的乘积。

PHP也有一些更好的随机函数,如random_bytes()openssl_random_pseudo_bytes()。这些将返回一个保证唯一的值。把它传给bin2hex(),你就搞定了!

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

请尝试添加md5(time().$filename.'.'.$extension)