短链接的算法

什么是短链接?

短链接,其实就把我们平时看到的网络地址,转换成比较简短的网址。
案例:我们可以把https://www.baidu.com/ 简化为短链接:https://qnr.io/j6Dcss。
短链接的优势:简短、美观、便于传播,比如说给一些用户push短信的时候,短链接就很有优势,短信一条70个字,短信内容超过70个字的时候就按两条计费了,这时候利用短链接,可以压缩短信内容,顺便也能短信费用了。

原理解析

当我们在浏览器里输入 https://qnr.io/j6Dcss 时短链接的算法_第1张图片

  1. DNS解析qnr.io域名,发送GET请求 /j6Dcss
  2. 服务器会通过短码获取对应的原URL
  3. 然后通过 HTTP 302 转到对应的原URL

HTTP 301与 302的区别

301 是永久重定向,302 是临时重定向。短地址一经生成就不会变化,所以用 301 是符合 http 语义的。同时对服务器压力也会有一定减少。
但是如果使用了 301,我们就无法统计到短地址被点击的次数了。而点收集击次数的意义那就不言而喻了,关键是现在服务器硬件设备都很好,还有支持高并发的NGINX,所以对服务器的压力几乎可以忽略,最终也就选择302。

算法实现

网上比较流行的算法有两种 自增序列算法、 摘要算法

自增序列算法

短址的长度一般设为 6 位,而每一位是由 [a - z, A - Z, 0 - 9] 总共 62 个字母组成的,所以 6 位的话,总共会有 62^6 ~= 568亿种组合,一般肯定是够用了。
将原网址分配一个从1位到6位的随机短码,存数据库记录,对返回的id进行62进制转码。

摘要算法

  1. 将原网址 md5 生成 32 位签名串,分为 4 段, 每段 8 个字节
  2. 对这四段循环处理, 取 8 个字节, 将他看成 16 进制串与0x3fffffff(30位1) 与操作, 即超过 30 位的忽略处理 这 30 位分成 6 段, 每 5位的数字作为字母表的索引取得特定字符, 依次进行获得 6 位字符串
  3. 总的 md5 串可以获得 4 个 6位串,取里面的任意一个就可作为这个长 url 的短 url 地址 这种算法,虽然会生成4个,但是仍然存在重复几率

两种算法优势

第一种算法的好处就是简单好理解,永不重复。但是短码的长度不固定,随着 id 变大从一位长度开始递增。如果非要让短码长度固定也可以就是让 id 从指定的数字开始递增就可以了。

第二种算法,虽然几率很小,但是存在碰撞(重复)的可能性。短码位数是比较固定的。

你可能感兴趣的:(数据结构与算法)