短网址源于Twitter中140个字符的限制,有时候一个长网址就占了100个字符,所以需要一个服务将长网址转化为短网址,比如百度短网址服务。
通常短网址服务需要两个接口:
- 生成短网址
- 根据短网址查询长网址
当直接访问短网址时,短网址服务器返回一个302和真实网址,然后浏览器会再去访问长网址
生成短网址
短网址可以类比DNS,也是内部维护了一套对应关系然后提供访问:
短网址设计关键点在于后缀token的算法,这里给出一种:
CHARS = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789"
我们将token认为是一个64进制的数,那8位64进制的数完全可以满足短网址申请的数量且不重复。
基本过程如下:
long_url -> redis.incr(index) -> 10_to_64(index) -> token
当然10_to_64返回的是一个字符串而不是真正的数字,基本实现如下:
def 10_to_64(num):
if num == 0:
return CHARS[0]
res = []
while num:
num, rem = divmod(num, len(CHARS))
res.append(CHARS[rem])
return ''.join(reversed(res))
获取到token后只要和URL一起存入数据库即可
根据短网址查询长网址
查询时从短网址中解析出token然后查询数据库即可,基本过程如下:
short_url -> token = parse(short_url) -> select url from database where token=`token` -> url