**说到随机函数的应用,作为一个菜鸟,理解的也不是很深刻,在这里之作为一个笔记来记录,以后慢慢将其掌握之后,再在内容上面进行加深。
随机函数的作用,常常是用来生成验证码、随机文件名、订单号,如果用来做安全验证的话常常用来生成加密key、token等等。**
一、常见的随机函数
1、rand()
常用的随机函数,默认生成0-getrandmax()之间的随机数,不过因为性能问题,已经被mt_rand()函数替代
相关函数:
rand(int $min,int $max)
srand(int $seed),生成时间种子,同一个时间种子下随机生成的随机数值是相同的。
getrandmax()获取最大随机数,这里获取的随机数会随系统的不同而不同。如linux最大2147483647
2、mt_rand
常用的随机函数,默认生成0-mt_getrandmax()之间的随机数, Mersenne Twister 算法生成随机整数
相关函数:
mt_srand(),生成种子,同一个种子下随机生成的随机数值是相同的。
该函数是产生随机值的更好选择,返回结果的速度是 rand() 函数的 4 倍(手册是是这么写的),我个人并不认同的,我感觉他说的4倍是很多年前的事了。因为mt_rand()使用的Mersenne Twister algorythm是1997的事,所以在很多年前,和rand()在速度上的差异可能是(4倍),自2004年,rand()已经开始使用algorythm,所以现在它们速度上没有太大的区别.
有时候手册也是骗人的,就像一会要说的这个函数造成的问题。
3、uniqid()
生成唯一ID的函数,精确到了微妙,较mt_rand精确。适用场景生成token和生成uuid
具体细节没做研究
4、openssl_random_pseudo_bytes()
适用于生成token,具体详情没做研究
二、mt_rand()函数造成的问题所在
--
今天重点记录一下mt_rand带来的问题,和在CTF中的具体解法。对于这个函数的介绍是有两个版本的,一个是英文版,一个是中文版