随机字符串和唯一性
1. uniqid函数不能生成唯一ID
实际开发中,经常要使用到唯一字符串。PHP中提供uniqid
函数来生成唯一的ID,这个函数“获取一个带前缀、基于当前时间微秒数的唯一ID”。但在循环或高并发中,生成的ID并不唯一,下面举例说明:
for($i=0; $i<10; $i++){ $uid = uniqid(); echo $uid . "<br/>"; }
58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8 58fb1dcf15fb8
即使加上md5
也无用,md5
函数是计算字符串的 MD5 散列值,如果计算的字符串相同的话,那么算出来的散列值也相同了,所以加上md5
并不能使字符串增加唯一性。
2. 唯一字符串并不唯一
所谓的唯一字符串,事实上并不是绝对的唯一。在生成随机字符串的时候,函数并不知道以前生成了哪些字符串,还是照着以前的规则产生字符串,就几率产生重复的字符串。所以生成唯一字符串的关键不是字符串是否唯一,而是字符串有多大几率产生重复。
_(这里还有另一种情况,就是生成随机字符串的函数知道以前生成了哪些字符串,这样的话,就能生成绝对的唯一字符串了。但是,每次生成了随机字符串,都要去查询以前生成的字符串,判断一下是否重复了,重复了就再生成一个,然后再重复上面的过程,直到不重复为止。唉,说都麻烦,何况要实际去做了!这样做效率非常低,要根据实际情况去选择)_
举个例子,小明从池塘2条鱼中钓到一条鱼A,然后把鱼A放回池塘,问再次钓到鱼A的几率是多少?如果池塘有10条鱼呢,100条呢?池塘中的鱼越多,两次钓到同一条鱼的几率就越小。同理,可产生的随机字符串越多,字符串重复的几率就越小。
以下面的代码为例:现在主管要求你写代码生成2000个邀请码,那你马上就得问主管:邀请码几位字符?主管答:6位!你心底一转,下面的随机字符串函数能生成 36^6(2176782336) 个邀请码,从这么多的邀请码中随机选出的2000个,重复的几率极低极低,很好很好。
/** * 生成随机字符串 * @params int strLen 随机字符串的长度 * @return String */ function generateRandomString($strLen){ $chars = "0123456789abcdefghijklmnopqrstuvwxyz"; $maxIndex = strlen($chars) - 1; $randomString = ""; for($i=0; $i<$strLen; $i++){ $randomString .= $chars[mt_rand(0, $maxIndex)]; } return strtoupper($randomString); }
当然函数也可以自己写,不必非得上面这个。
总结
唯一字符串不唯一,只是重复的几率低;要想重复的几率低,就要使字符串总数尽量多,选择的字符串尽量少。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)