参考工具
社交平台中添加链接后,后台会将域名转换为t.cn
等形式。2011年3月,新浪微博收购t.cn
短网址,取代之前的短链。例如t.cn
是最短的域名,t
是微博的代名词,twitter
有t.co
作为短网址,sina有t.cn
,taobao有c.tb.cn
。
短网址实际指的是将原来较长的网址转化为较短的网址,从而便于用户记忆和传播。以新浪微博威力,用户输入需缩短的长网址,转化后得到以http://t.cn
域名开头的短网址,其后用户将该网址通过微信或微博等方式分享给朋友。朋友点击后即可将进入原本长网址所对应的页面。
新浪微博短网址
实现短网址关键点
- 如何将任意长的字符串转化为较短且唯一的字符串
- 如何将短网址还原为真实网址
短链实现思路
将网址存入数据库获得自增主键
id
,将其加密后字符串后输出。调用短链时,通过路由解密获取实际链接,最后重定向进行跳转。对每个网址生成对应的编码,例如php中可采用
base_convert(number, frombase, tobase)
,此编码作为短网址域名后的参数,将网址和编码一并存入数据库。访问短链时,通过路由获取编码,根据编码查询数据库得到真实网址后,进行重定向跳转。
短链接具体步骤
- 将真实网址存入数据库,获得自增主键,由于自增主键是唯一且自增的。
DROP TABLE IF EXISTS `shorturl`;
CREATE TABLE IF NOT EXISTS `shorturl`{
`id` int(11) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '真实网址',
`code` varchar(32) NOT NULL DEFAULT '' COMMENT '短链编码',
`created_at` timestamp NOT NULL DEFAULT 0 COMMENT '创建时间',
`updated_at` timestamp NOT NULL DEFAULT 0 COMMENT '修改时间'
}ENGINE=InnoDB auto_increment=1 charset utf-8 COMMENT '短网址';
- 将自增主键通过进制编码形成字符串作为编码,此编码也是唯一的。
<?php
$id = 1;
$code = base_convert($id, 10, 36);//对十进制的id进行进制转换为36进制
?>
此处的思路有多种
- 直接对自增主键进行编码解码,需要编码解码的函数或类库支持。
- 采用进制转换时直接使用随机数替代自增主键
$code = base_convert(rand(100000,999999), 10, 36);
- 采用自定义的编码方式而非进制转换的方式
function shorturl($url){
return code(sprintf("%u", crc32($url)));//%u为long long int型
}
function code($int){
$code = '';
while($int>0){
$n = $int%62;
if($n > 35){
$n = char($n + 61);
}elseif($n>9 && $n<=35){
$n = char($n + 55);
}
$code .= $n;
$int= floor($int/ 62);
}
return $code ;
}
- 将编码和短域名合并形成短网址
http://t.cn/kj12m
以上思路,仅供参考。具体环境涉及数据规模、并发、重复情况、执行效率等因素,需根据实际测试情况,权衡利弊。