短网址主要功能包括网址缩短与还原两大功能。相对于长网址,短网址可以更方便地在电子邮件,社交网络,微博和手机上传播,例如原来很长的网址通过短网址服务即可生成相应的短网址,避免折行或超出字符限制。
![](https://img.kancloud.cn/3e/e0/3ee01de6436cdc2a88b9e99992827a1e_1080x582.png)
常用的ID生成服务比如:mysql ID自增、 redis键自增、号段模式,生成的ID都是一串数字。短网址服务把客户的长网址转换成短网址,
实际是在dwz.cn域名后面拼接新产生的数字类型ID,直接用数字ID,网址长度也有些长,服务可以通过数字ID转更高进制的方式压缩长度。这种算法在短网址的技术实现上越来越多了起来,它可以进一步压缩网址长度。转进制的压缩算法在生活中有广泛的应用场景,举例:
客户的长网址:https://www.taobao.com/goods/shopping?code=PCoperatebanner
ID映射的短网址:https://dwz.cn/2047601319t66
转进制后的短网址:https://dwz.cn/2ezwDJ0
长数字转短字符串的压缩算法,以下为具体实现:
```
/**
* 10进制转为62进制
* @param integer $n 10进制数值
* @return string 62进制
*/
function dec62($n) {
$base = 62;
$index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$ret = '';
for($t = floor(log10($n) / log10($base)); $t >= 0; $t --) {
$a = floor($n / pow($base, $t));
$ret .= substr($index, $a, 1);
$n -= $a \* pow($base, $t);
}
return $ret;
}
```
字符串同样支持反解,将高位进制转为10进制。
```
/**
* 62进制转为10进制
* @param integer $n 62进制
* @return string 10进制
*/
function dec10($s) {
$base = 62;
$index = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$ret = 0;
$len = strlen($s) - 1;
for($t = 0; $t <= $len; $t ++) {
$ret += strpos($index, substr($s, $t, 1)) * pow($base, $len - $t);
}
return $ret;
}
```
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 依次表示0-62,大小写表示不同的进制。10进制的数字采取62进位压缩的方式转为字符串,仅需要6位就可以满足500多亿的网址(568 0023 5583),唯一性得到满足的同时保证长度够短,在具体实现中也可随机跳跃生成,防御撞库攻击。