需求:不想暴露uid,比如:uid=10001 变成 uid=Xf9Cw,基本上,对于目前的项目,5个字符包含0-9;a-z;A-Z,那么就是 62的5次方约为9.1亿,足够用了,在网上找了一段代码:function shortUrl($url){ 
    $result=sprintf("%u",crc32($url)); 
    $show=''; 
    while($result>0){ 
        $s=$result % 62; 
        if ($s>35){ 
            $s=chr($s+61); 
        }elseif($s>9&&$s<=35){ 
            $s=chr($s+55); 
        } 
        $show.=$s; 
        $result=floor($result/62); 
    } 
    return $show; 
} for ($i=0; $i < 1000 ; $i++) { 
   echo $i, ' >> ', shorturl($i);
   echo '<br>';
}我想知道,用这段代码生成的字符串,在有效范围内。会出现重复值吗?因为我的uid是唯一的,对应生成的5个字符,也需要是唯一的。还有一些朋友说,可以自己写一个加密算法。可是算法不太会写呀。有没有哪个朋友可以介绍一下,有没有什么好的算法。通过uid生成唯一的5位字符串,固定的那种,0-9,a-z;A-Z

解决方案 »

  1.   

    我输出结果为:0 >> LWx0U4
    1 >> hsYiP2
    2 >> Jb3TU
    3 >> jT0h02
    4 >> y8BiS4
    5 >> 8FveQ2
    6 >> UDCkX
    7 >> ASWCx1
    8 >> 3sxqZ4
    9 >> 3bn7a2看这个好像不是进制转换吧?
      

  2.   

    算法本质数数制转换,但你对传入的数又做了 crc 校验(crc32($url))
    由 crc 校验和的生成原理可知 crc32($url) 的结果是可能出现重复的
      

  3.   


    /** 生成短网址 
    * @param  String $url 原网址 
    * @return String 
    */  
    function dwz($url){  
      
        $code = floatval(sprintf('%u', crc32($url)));  
      
        $surl = '';  
      
        while($code){  
            $mod = fmod($code, 62);  
            if($mod>9 && $mod<=35){  
                $mod = chr($mod + 55);  
            }elseif($mod>35){  
                $mod = chr($mod + 61);  
            }  
            $surl .= $mod;  
            $code = floor($code/62);  
        }  
      
        return $surl;  
      
    }  
    <?php  
    echo dwz('http://blog.csdn.net/fdipzone'); //rs5U24  
    ?>
    参考:http://blog.csdn.net/fdipzone/article/details/18684583
      

  4.   

    意思就是假如:<?php  
    $j= 56800235584;  //这里是假如
    for ($i=0; $i < $j; $i++) { 
        echo dwz($i);
    }
    ?>那么,输出的dwz 会不会有重复值?