网页短地址(短链接、短链)是指将原本较长的网址转化成较短的网址,从而便于用户记忆、输入,便于在社交软件上的传播,以及为生成的二维码不至于太密集。很多互联网公司都提供了生成短链的服务,比如新浪微博短网址服务:http://sina.lt/,本文主要整理实现短网址服务的基本原理。
短网址服务的整个流程是:还以新浪微博短网址服务为例,用户输入想要缩短的长网址,转化后得到一个以http://t.cn开头的短网址,然后用户将该短网址通过微信或者微博等方式分享给朋友,其他人点击之后即可进入原本长网址所对应的页面。
实现短网址服务主要有两个关键:
1、如何把一个任意长度的字符串转化成一个较短的字符串?
2、从短网址如何还原出长网址。
很容易让人想到哈希算法,通过一定的方式将任意长的文本转化成一个固定长度的字符串,只要目标字符串的长度适当,那么不同的输入几乎对应的就是不同字符串。不过有个缺点就是无法从短网址还原成长网址,因此不适用我们的场景。但基于哈希算法的思想,我们可以设计一种以多进制为基础的算法完成这个任务。具体来说就是:
我们可以创建一个用于保存长网址的数据表,这张表只有两个字段,一个自增主键用于保存id,另一个url字段用于存放原始的长网址,每个长网址都在这张表有一条记录。当进行长网址转换时,先检查数据表中是否存在该长网址,若是存在则直接获取该长网址的id,否则在数据表中创建一条新记录,并返回新生成的id。对于这个id,我们可以转化成一个多进制表示的新值。比如用以“0-9a-z”这36个字符表示的36进制,100000000(共9位数)这个数字可以被表示成1njchs,只需要6个字符即可,将这6个字符拼接到准备好的域名后即可得到一个对应的短网址返回给用户。由于一亿个网址只需要6个字符,因此这种方式足够满足大部分网站的需求。
当用户点击短网址后,只需要将短网址中代表多进制的这部分提取出来,还原成十进制的数字作为id查表中的url即可得到原始的长网址,再把这个短网址的请求重定向到长网址即可让用户访问到原始的网页。
另外,在根据长网址去数据表查找它是否存在时,因为长网址可以任意长,因此直接用它作为索引在数据表中查找的话效率较低,可以考虑在表中增加一个hash字段,保存长网址的哈希值,并通过查找哈希值来判断条目是否存在,提高查找的效率。