随机字符串和唯一性

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);
}

  当然函数也可以自己写,不必非得上面这个。

总结

  唯一字符串不唯一,只是重复的几率低;要想重复的几率低,就要使字符串总数尽量多,选择的字符串尽量少。

转载于:https://www.cnblogs.com/lhat/p/6748305.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值