Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

短链接原理 #133

Open
louzhedong opened this issue Mar 1, 2019 · 0 comments
Open

短链接原理 #133

louzhedong opened this issue Mar 1, 2019 · 0 comments

Comments

@louzhedong
Copy link
Owner

louzhedong commented Mar 1, 2019

短链接系统实现原理

如果你在工作中做过活动页,或者需要生成二维码时,不知是否遇到过这样的情况:活动的URL上会带上许多参数,导致URL会非常长,这时候生成二维码会使得二维码非常的密集,识别率也会下降,直接分享URL也会显得很复杂。这个时候,你就需要用到短链接了。

短链接:即将普通网址,转换成比较短的网址,类似http://dwz.cn/ABC23D 这种。

原理解析

当我们访问http://dwz.cn/ABC23D这个地址时:

  1. DNS首先会解析http://dwz.cn的IP地址
  2. 当获得IP地址后,会向地址发送HTTP GET请求,查询短码ABC23D
  3. 服务器通过短码获取对应的真实URL
  4. 通过301或302重定向到真是URL
算法实现

算法一:自增序列算法

设置ID自增,一个十进制的ID转化为62进制的数值

由于短链接是短码每一位都由[a - z, A - Z, 0 - 9]组成,总共有62个符号,如果短链接的长度为6位,总共有62^6 ~= 568亿中组合。

但直接这样生成的短码会有一定的规律,可能会不安全,解决办法是将62个字符的顺序打乱。

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

第一种算法简单好理解,永不重复,但是短码的长度不固定

第二种算法存在一定的碰撞几率

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant