我正在编写一个PHP脚本来处理文件上传到服务器。为了防止在存在同名文件时进行覆盖,程序会将每个上传的文件重命名为当前时间戳。
然而,这还不够。在高峰时段,可能会有同一时间上传的文件。为了确保上传的文件具有不同的文件名,我想在时间戳的末尾添加一个随机数。
然后,我从the official PHP page on srand()
阅读注意:无需为随机数生成器播种 srand()或mt_srand(),因为这是自动完成的。
我猜他们正在使用srand()
的时间戳。如果在同一秒上传2个文件,那么srand()
的时间戳,随机结果是否相同?如果是,有没有办法确保名称不重复,即使它们是在同一时间上传的?
答案 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())))
所以它是时间戳和进程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)
的内容。