趣文网 > 作文大全

3分钟短文|PHP伪随机Token生成器 实地测试 效果感人!

2020-11-27 14:50:02
相关推荐

引言

我们经常可能会用到邀请码,邮件验证码,或者需要使用unique 字符串标记用户属性的情况。

今天我们且不说高深的“全局唯一ID”的生成方案,我们说一个简单的,如何生成一个唯一的,随机的,数组字母组成的字符串。

学习时间

PHP 有一个内置函数 uniqid,用于生成一个唯一的ID。该函数结构形式:

string uniqid([ string $prefix = ""[, bool $more_entropy = false]] )

用于获取一个带前缀、基于当前时间微秒数的唯一ID。

但是该方法所生成的ID并不是安全的,且依赖于本机的时间戳,有可能在同一微秒生成同一ID。所以安全起见,需要添加上 prefix 参数,以示区别。

more_entropy 参数使生成的ID更具有唯一性,如果设置为 TRUE,uniqid() 会在返回的字符串结尾增加额外的煽(使用combined linear congruential generator)。

这就够了吗?这当然不是最优的解决方法。我们尝试其他解决方案。使用 openssl 带来的加密性和唯一性。

bin2hex(openssl_random_pseudo_bytes($bytes))

使用 openssl_random_pseudo_bytes 函数生成一个伪随机字符串的字节,然后使用 bin2hex 将其格式化为十六进制的字符串。

生成的伪随机字节,其字节数由length参数确定。还指示是否使用了加密功能强的算法来生成伪随机字节,并通过可选的crypto_strongparameter来执行此操作。 此种方法返回的参数,很少情况下会出现false。

美中不足的是,这样生成的数字字符串,只在[0-9][a-z]之间,不够广泛。我们尝试加固这个生成方法,增强其鲁棒性。

上述函数会生成一个区间位于 [$min, $max] 的随机数字。然后调用该函数生成指定长度的字符串。

函数 crypto_rand_secure 函数的实现方法,在PHP标准函数中,可以使用 rand / mt_rand 函数替代。

在PHP 7 中,系统提供了更好的函数,可以替代 crypto_rand_secure 使用,就是 random_bytes 和 random_int。使用内置函数,我们将 getToken 函数改造如下:

当然少不了的测试结果,我们批量生成一些 32 位长度的字符串。

写在最后

本文深入探讨了生成随机数字,进而生成指定长度的字符串,实现函数并进行了测试。大家可以在机器环境进行测试。

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

五年级作文小草 作文家乡的端午节450字 游泳作文600字 我眼中的高中作文 蚂蚁作文500字 以什么为乐的作文 友情作文题记 最美环卫工人作文600字 我想当老师作文600字 描写秋雨作文 断舍离 作文 老师不在时作文 有母亲陪伴的日子作文 围棋选手小柯作文800字 难忘的什么之旅作文 有关人的作文600字 一次爬山的经历作文 雅思小作文图表题 作文题目空几个格 关于学习的作文500字 五年级下册语文作文第二单元 关于重阳节的作文300字 青春恰自来作文800字 爱国事例作文 写做菜的作文 面对灾难作文 写辣椒的作文 作文我的老师三年级 小学三年级作文题目大全 我与什么作文