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生成器,实地测试,效果感人!】我是@程序员小助手 , 持续分享编程知识 , 欢迎关注 。
推荐阅读
- 大米嘚啵嘚历史短文|世人皆知“负荆请罪”,却不知长平之战后,蔺相如、廉颇的下场
- 曾经把钱输光的他,3分钟写的写的一首歌,一值的销量都无人打破
- 3分钟学会科目三灯光操作,成都驾考课堂考试口诀
- 科学探索|德国曾经制造出飞碟,3分钟升到千米高空?德国投降后飞碟去哪了
- 摆摆鲸鱼君|八字短文案 漫漫星河 温暖人间
- 小玲美食记|发面饼怎样才蓬松柔软,不擀面不揉面,筷子一搅,3分钟就能出锅
- 出场3分钟送助攻!郑智接班人踢疯了,保利尼奥附体效率完胜何超
- 痛心的“巧合”!男子醉酒躺路上,3分钟后一醉酒司机开车经过…
- 江苏新闻|痛心的“巧合”!男子醉酒躺路上,3分钟后一醉酒司机开车经过…
- 杭州6岁男童1对1游泳课溺水3分钟,场内4名救生员无人发现救援,最近一名距离出事地点不到3米
