我正在编写一个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)
。