zoukankan      html  css  js  c++  java
  • 随机字符串和唯一性

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

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

    总结

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

  • 相关阅读:
    二分图最大匹配的K&#246;nig定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/lhat/p/6748305.html
Copyright © 2011-2022 走看看