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

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

文章图片

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

文章图片

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

引言
我们经常可能会用到邀请码 , 邮件验证码 , 或者需要使用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 :_)
【AR|3分钟短文 | PHP伪随机Token生成器,实地测试,效果感人!】我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。


    推荐阅读