🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
短网址主要功能包括网址缩短与还原两大功能。相对于长网址,短网址可以更方便地在电子邮件,社交网络,微博和手机上传播,例如原来很长的网址通过短网址服务即可生成相应的短网址,避免折行或超出字符限制。 ![](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),唯一性得到满足的同时保证长度够短,在具体实现中也可随机跳跃生成,防御撞库攻击。