🍪🧁🍧

短链接生成原理

用户通过短链发送一个http的GET请求,对应的API解析得到对应的长链接,然后重定向到长链接

此处有一个问题,为什么要用302不用301?
301是永久重定向,302是临时重定向。短地址一经生成就不会变化,所以用301是符合http语义的。但是如果用了301, Google,百度等搜索引擎,搜索的时候会直接展示真实地址,那我们就无法统计到短地址被点击的次数了,也无法收集用户的Cookie, User Agent 等信息,这些信息可以用来做很多有意思的大数据分析,也是短网址服务商的主要盈利来源

301重定向会将原URL的搜索排名和流量传递给新URL,而302重定向则不会。

短链接生成算法

自增序列算法

短链中的字符一般是[0-9,a-z,A-Z]共62个字符,所以短链就是一个62进制的字符串

首先维护一个自增的 ID,当生成短链接时,将 10 进制的自增 ID 转换成 62 进制字符串,这个字符串就可以唯一标识一个长链接。

维护自增 ID 主要有以下几种方式:

  • 数据库主键自增
  • redis 自增
  • 分布式自增主键 ID(雪花算法,存在 ID 浪费)

摘要算法

摘要算法又称哈希算法,它表示输入任意长度的数据,输出固定长度的数据。相同的输入数据始终得到相同的输出,不同的输入数据尽量得到不同的输出。

算法过程:

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

虽然几率很小,但是该方法依然存在碰撞的可能性,解决冲突会比较麻烦。不过该方法生成的短码位数是固定的,也不存在连续生成的短码有序的情况。

普通随机数

该方法是从62个字符串中随机取出一个6位短码的组合,然后去数据库中查询该短码是否已存在。如果已存在,就继续循环该方法重新获取短码,否则就直接返回。

该方法是最简单的一种实现,不过由于 Math.round()方法生成的随机数属于伪随机数,碰撞的可能性也不小。在数据比较多的情况下,可能会循环很多次,才能生成一个不冲突的短码。

posted @ 2025-05-17 00:45  不想吃fun  阅读(99)  评论(0)    收藏  举报