我GitHub上的项目链接变成了这么短
http://suo.im/zlqlb
短网址的发展历史其实不长,他的出现主要是基于微博(如新浪微博,http://t.cn,http://url.cn)、短博客、移动营销的崛起而发展起来的。在这些环境中,过长的网址使得用户视觉体验度极差,所以有必要将很长的网址进行缩短。那么短网址缩短的原理是什么呢?
将原网址通过MD5
转化成一串小字母,这种方法简单,但是这种算法是不可逆的,所以别想着直接反转短地址,如果你想深入了解这种算法,可以百度“MD5”+”短网址”
数据库类型的存储式,通过给每个长网址自动分配ID
和CODE
来实现网址的转换,然后当用户访问时,通过查询数据里面ID
和CODE
对应的原网址,实现实时跳转。这种方式是可逆的,而且便于管理和统计,目前主流的短网址程序都是应用的这种方式,如:phurl
,yourl
等。
function get_last_number() {
$db_result = mysql_query("SELECT last_number FROM ".DB_PREFIX."settings") or db_die(__FILE__, __LINE__, mysql_error());
$db_row = mysql_fetch_row($db_result);
return $db_row[0];
}
function increase_last_number() {
mysql_query("UPDATE ".DB_PREFIX."settings SET last_number = (last_number + 1)") or db_die(__FILE__, __LINE__, mysql_error());
return (mysql_affected_rows() > 0) ? true : false;
}
function generate_code($number) {
$out = "";
$codes = "abcdefghjkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ";
while ($number > 53) {
$key = $number % 54;
$number = floor($number / 54) - 1;
$out = $codes{$key}.$out;
}
return $codes{$number}.$out;
}
function insert_url($url, $code) {
mysql_query("INSERT INTO ".DB_PREFIX."urls (url, code, date_added) VALUES ('$url', '$code', NOW()") or db_die(__FILE__, __LINE__, mysql_error());
return mysql_insert_id();
}
原理就是给每一个过来的长地址,发一个号即可,小型系统直接用mysql的自增索引就搞定了。如果是大型应用,可以考虑各种分布式key-value系统做发号器。不停的自增就行了。
第一个使用这个服务的人得到的短地址是http://xx.xx/0
第二个是 http://xx.xx/1 第11个是 http://xx.xx/a 第依次往后,相当于实现了一个62进制的自增字段即可。
原理?数据库而已
数据库结构
token url
token 短连接token,5个长度字符可以容纳(52个大小写字母+10个数字)5次方=916132832
url 原始链接
你的是GitHub的把长连接缩短成短链接,下面是网址:
https://git.io/
常用的缩短网址有:
Google:https://goo.gl/
bitly: https://bitly.com/
上面答非所问,改正下,不知道你有没有发现:
就是短链接定向到你的长链接去了,而长短链接的对应关系一般是会存储到库因为很难有算法能做到长短链接一一对应,所以一般是存储到mongodb以及缓存吧
1 回答4.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答580 阅读✓ 已解决
788 阅读
0-9 a-z A-Z 你看看主流的短连接是几位的 每一位随机取 基本不会重复 保险起见数据库查一遍是否重复,然后key和url存入数据库,前期量小的话 很简单 直接根据key取url然后重定向,后期访问压力大了,基本就是读压力,前端档一个缓存就好了