第二章短链接
2.1短链接的应用分析
微博的盛行,因为其独特的简短和不可能改性。但是,最多140字的限制,让插入一段长的链接之后的博文“捉襟见肘”!为了弥补这个缺憾,新浪sina.cn和腾讯url.cn也纷纷效仿Twinter推出了自己的短连接服务。Sina.cn目前已经换成了t.cn让转化后的域名更加简短。不仅如此,用户友好,便于管理也是短链接的特色!
如下图:
下面为分享中的应用:
即无论用户添加了多长的链接地址,通过服务器url的压缩之后都会只转化成只有6个字符的链接地址。而且这6个字符必须满足能够表示最大数量且重复的几率非常小或者说没有重复的这种可能!
2.2短链接的实现原理
大体的原理按照是否使用数据库分为两类:
第一类使用数据库,这个是绝大多数网站应用的方法。
第二类不用数据库,提供对等的加密和解密函数。
第三类是调用第三方的接口实现,但会有诸多限制,比如谷歌的goo.gl。
下面我说下二者的区别。
第一类主要是通过以下方法实现:
l定义一个url对字符的映射
l实现自己的加密算法来完成这次映射
l使用数据库单向存储完成的映射字符串
l服务器获得参数,与数据库中的长短链接对照实现跳转判断
这样容易锁定自己的用户群,比如非新浪微博用户,将不会提供短连接服务。而且对加密的链接的安全性做一个网址检测接口,可以防止为非法挂马以及欺诈性的网站提供服务,这样比较容易管理,也比较符合现在工信部的要求。而且短连接服务获得的信息又是一笔资源。
第二类
主要是小型网站的调用方法
不经过数据库,直接进行提交的参数进行解密从而实现相应的跳转。但是这种方式是非常不安全也是不科学的。一旦加密函数被恶意破解,网站的服务器资源就会面临着瘫痪的危险。不推荐这种方法。
下面我只介绍第一类的实现方法
所有的网站在实现的过程中都会使用MD5来生成定长的字符串然后通过对生成的字符串的操作来进行加密和压缩.数据处理为26个英文小写字母(a-z)、26个英文大写字母(A-Z)和(0-9)10个数字总计62个字符。
算法一
1)将长网址MD5生成32位串,分为4段,每段8个字节;
2)对这四段循环处理,取8个字节,将他看成16进制串与0x3fffffff(30位1)与操作,即超过30位的忽略处理;
3)这30位分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串;
4)总的md5串可以获得4个6位串;取里面的任意一个就可作为这个长url的短url地址;
这种算法会生成4个字符串,使用其中的任意一个都行,存在重复几率。不利于存储和选取,而且相应的重复的概率相对其他算法大一点。
算法二
a-Z,0-9这64位取6位组合,可产生500多亿个组合数量,把数字和字符组合做一定的映射,就可以产生唯一的字符串,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。把长网址存入数据库,取返回的id,找出对应的长链接即可。比如插入的第1个数据为aaaaaa,第2个数据为aaaaab,id为自增的。返回的就是id值,通过id和长链接进行映射关系,为所以如果用上面的62个字符,任意取6个字符组合成字符串的话,数据存量达到500多亿后才会出现重复的可能,因为id的唯一性。
这种算法其实也是不可取的,因为简单的洗牌算法,返回的id值为从一个序列号自增,导致所有用户都可以猜测访问。从而可以猜测破解洗牌算法,不安全。
算法三
我自己的算法
1)将长网址MD5生成32位定长的串,然后5个一组,分6组,舍去最后两个字符。
2)分别对每组进行的5个字符看成16进制转化成2进制字符串,并压入数组。因为md5加密的最大数f转化为二进制位1111,所以都换成4位的二进制数位数不够的补0,后期验证因为有较大的随机性和不重复性,所以可以取消补0的操作,但是补0之后重复的概率就更小。
3)遍历数组中的元素,分别去元素的前6位二进制数,并再次压入数组。6位的二进制数最大表示127位字符,足以满足映射条件。
4)对新的数组遍历,然后转化为十进制数,对照自定义的base_62_very数组的映射关系,提取6位字符,短链接生成成功。为了加密原则,我自定义了key密钥,随机替换映射的字符。且可以定期更换密钥,对于破解来说是难上加难,也可以说是不可能的。不仅仅是因为md5的不可逆性,还是因为自定义的base_62_very数组以及密钥的替换增加了难度。
下面是我的加密函数代码:
注:因为论文防止抄袭,思路我已经说了,大家可以自己写属于自己的加密函数。下面只给出部分代码,如果想要全部代码的,请私下找我,但禁止私下传播!只供学习探讨之用!
functionmyshorturl($lurl) { $default="http://very3721.com/url/?l=";//这里是提供短链接服务的域名,我写的是我自己网站的域名信息 $key='antengfei';//加密的密钥,宗旨就是替换加密字段,让加密字段没有规律,防止被恶意破解,可以定期更换密钥 $base62_very=array ('0','1','2','3','4','5','6','7','8','9','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','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'); //print_r($base62_very); $curl=md5($lurl); $base62_very=encode($base62_very,$key);//启用密钥加密 //echo"加密后的字符串".$curl."<br/>"; $strlen=strlen($curl); $first_tmp=array(); $out=""; ............ |
2.3短链接的测试和应用
2.3.1效果
当不输入参数或者参数非法的时候,将会提示:
$l=$_GET['l']; $default='http://very3721.com/url/?l='; if($l==NULL) { echo"参数错误,系统将3秒内自动带您返回首页,如果没有跳转请点击即"; echo'<script>'; echo'setTimeout("location.href="http://very3721.com"",3000)'; echo'</script>'; echo"<ahref='http://very3721.com'>点击返回首页</a>"; echo'<divwidth:401px;height:418;text-align:center; style="background-image:url(../img/404.gif);background-repeat: no-repeat;">'; echo'</div>'; } else { $newurl=$default.$l; echo$newurl; require_once"../very_class/class.dbconn.php"; $result=$db->query("select*fromshorturlwheresurl='$newurl'"); $row=$db->fetch_array($result); $link=$row['lurl']; echo"<script>location.href='$link'</script>"; } |
因为页面必须接受用户提供的参数,所以头部应该先接受GET的值,所以不能用header的301重定向,因为我的是空间服务器,不支持.htaccess文件,所以访问参数前要加上“?l=”,如果支持通过.htaccess设置,可以不加这个参数,达到和新浪、腾讯的目录下直接加参数的效果。
压缩页面如下,例如压缩原长url:
url=http://www.baidu.com/s?wd=��Ԩ�Z&opt-webpage=on&ie=gbk;是百度搜索“安渊璟”的长链接。
获取短连接之后,和它相对应的长链接也就插入了数据库中,我们直接访问短链接,测试效果: