需求:不想暴露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
$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 >> hsYiP2
2 >> Jb3TU
3 >> jT0h02
4 >> y8BiS4
5 >> 8FveQ2
6 >> UDCkX
7 >> ASWCx1
8 >> 3sxqZ4
9 >> 3bn7a2看这个好像不是进制转换吧?
由 crc 校验和的生成原理可知 crc32($url) 的结果是可能出现重复的
/** 生成短网址
* @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
$j= 56800235584; //这里是假如
for ($i=0; $i < $j; $i++) {
echo dwz($i);
}
?>那么,输出的dwz 会不会有重复值?