1、背景简介 html
短网址应用已经在各大微博上开始流行了起来。例如QQ微博的url.cn,新浪的sinaurl.cn等。咱们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.cn/0nAcBW。 算法
为何要这样作的,缘由我想有这样几点:
一、微博限制字数为140字一条,那么若是咱们须要发一些链接上去,可是这个链接很是的长,以致于将近要占用咱们内容的一半篇幅,这确定是不能被容许的,因此短网址应运而生了。
二、短网址能够在咱们项目里能够很好的对开放级URL进行管理。有一部分网址能够会涵盖色情,暴力,广告等信息,这样咱们能够经过用户的举报,彻底管理这个链接将不出如今咱们的应用中,应为一样的URL经过加密算法以后,获得的地址是同样的。
三、咱们能够对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于咱们对项目的后续工做更好的做出决策。 数据库
2、如何实现 加密
下面先来看看短网址映射算法的理论(网上找到的资料)
1)将长网址md5生成32位签名串,分为4段, 每段8个字节;
2)对这四段循环处理, 取8个字节, 将他当作16进制串与0x3fffffff(30位1)与操做, 即超过30位的忽略处理;
3)这30位分红6段, 每5位的数字做为字母表的索引取得特定字符, 依次进行得到6位字符串;
4)总的md5串能够得到4个6位串; 取里面的任意一个就可做为这个长url的短url地址;
下面是PHP代码:
function shorturl($input) {
$base32 = array ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k', 'l', 'm', 'n', 'o', 'p','q', 'r', 's', 't', 'u', 'v', 'w', 'x','y', 'z', '0', '1', '2', '3', '4', '5'); url
$hex = md5('prefix'.$input.'surfix');
$hexLen = strlen($hex);
$subHexLen = $hexLen / 8;
$output = array();
for ($i = 0; $i < $subHexLen; $i++) {
$subHex = substr ($hex, $i * 8, 8);
$int = 0x3FFFFFFF & (1 * ('0x'.$subHex));
$out = '';
for ($j = 0; $j < 6; $j++) {
$val = 0x0000001F & $int;
$out .= $base32[$val];
$int = $int >> 5;
}
$output = $out;
}
return $output;
} spa
3、输出结果
执行下面代码的结果以下,会产生4 组6 位字符串,任意一组均可以做为当前字符串的短连接地址。
print_r (shorturl(‘http://www.i5good.com/shorturl.html’));
结果:
nibgx3 htm
4、跳转原理
当咱们生成短连接以后,只须要在表中(数据库或者NoSql )存储原始连接与短连接的映射关系便可。当咱们访问短连接时,只须要从映射关系中找到原始连接,便可跳转到原始连接。 索引