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

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

    总结

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

  • 相关阅读:
    Hbase多master
    hbase 新增节点
    HBase优化
    hbase 各个概念,region,storefile
    HBase简介(很好的梳理资料)
    hbase blocksize设置,与hdfs关系
    hbase常用运维命令
    hbase很有价值的读写性能提升
    关于hbase的read操作的深入研究 region到storefile过程
    Storm 实现滑动窗口计数和TopN排序
  • 原文地址:https://www.cnblogs.com/lhat/p/6748305.html
Copyright © 2011-2022 走看看