Loading...

【面试真题拆解】平时会收发短信吧?你知道短信里那种 `CodeEdge` 的短链接,点击之后是怎么跳转到长链接的?它是怎么生成的?

面试官问:

“平时会收发短信吧?你知道短信里那种 xxxxx 的短链接,点击之后是怎么跳转到长链接的?它是怎么生成的?”

点击短链接后发生了什么?

两个字:重定向

  1. 用户点击短链接

比如用户点击 t.cn/xu0324

  1. 浏览器请求短链接服务器

浏览器向 t.cn 的服务器发送HTTP请求,要访问 /xu0324 这个路径;

  1. 服务器查映射关系

服务器去数据库或者Redis里查,发现 xu0324 对应的原始长链接是 https://www.CodeEdge.com/xxx

  1. 服务器返回重定向响应

服务器不返回网页内容,而是返回一个 HTTP 302状态码,并在响应头 Location 里填上原始长链接;

  1. 浏览器自动跳转

浏览器收到302状态码,看到 Location 里的长链接,自动发起新的请求,访问原始长链接;

之后,用户就看到了原始长链接的页面。

那个短链接是怎么生成的?

目前主流的生成算法有3种:

自增ID + Base62编码

用分布式ID生成器(比如雪花算法),生成一个全局唯一的自增数字ID(比如 1, 2, 3, …),再把这个10进制的数字ID,转换成62进制的字符串(Base62)。

这种方案因为是自增ID,每个ID对应唯一的Base62字符串,所以绝对唯一,没有哈希冲突,而且不涉及复杂的哈希计算,生成速度极快。

小贴士

什么是Base62呢?平时用的是10进制(0-9),Base62其实是0-9(10个)、a-z(26个)、A-Z(26个),加起来总共62个字符,所以叫Base62。

哈希算法+截取

对原始长链接做MD5或SHA-1哈希,得到一个32位(或更长)的哈希字符串,再截取哈希字符串的前6位或8位,作为短链接后缀。

这种方案对于两个不同的长链接,哈希后的前6位可能会一样,从而导致映射错误;如果发现了冲突,需要换一种截取方式(比如截取中间6位),或者加盐重新哈希,但这样也增加了复杂度。

随机字符串生成

直接随机生成一个6位的Base62字符串,再去数据库里查,如果这个字符串已经被占用了,就重新生成,直到生成一个没有被占用的。

这种方案会随着链接越来越多,冲突概率越来越大,可能要重试很多次才能生成一个可用的;并且高并发下,多个请求可能会同时生成同一个随机字符串,导致数据库唯一键冲突,所以不适合高并发场景。

为什么要用短链接?

1. 短信的字数限制

因为一条短信最多只能发70个汉字(或160个英文字符),如果直接发一个几百个字符的长链接,一条短信根本发不下,要拆成好几条,成本也会相应增加;如果用短链接,只需要十几个字符,就能完美解决字数限制的问题。

2. 防拦截、防屏蔽

长链接里经常包含很多参数,很容易被运营商、手机安全软件识别为“营销链接”或“钓鱼链接”,直接拦截,但如果用短链接的话,看起来很干净,被拦截的概率就会大大降低。

3. 数据统计和追踪

短链接服务器可以记录谁在什么时候、通过什么设备、点击了这个链接,企业通过这些数据,可以分析营销效果、用户画像、转化率等等。

Code Road Record