赞
踩
看业务代码的时候,有些逻辑用到了短链接服务,感觉还蛮有意思的,这里简单的记录一下。
这种营销短信大家应该都收到过,短信有最大字符限制,而且为了更好的观感体验,短信里的链接一般都很短。现成的短链接生成服务也比较多,比如新浪、百度等,谷歌之前也有短链接服务,号称是最快的,但是在 2018 年关闭了。
我们点击短链接会发起一个 GET 方式的 HTTP 请求,当请求到对应的 API 后,会解析短链接里的标识获取到对应的长链接,然后重定向到长链接,这样整个流程就结束了。
比如我用新浪的短链接服务为 https://www.google.com/ 生成了一个短链接:http://dwz.date/evn,下面是请求短链接时对应的 HTTP 信息:
短链接标识一般是 [0-9, a-z, A-Z] 随机组合而成的字符串,字符一共有 62 个,因此短链接标识可以用 62 进制的字符串表示。
首先维护一个自增的 ID,当生成短链接时,将 10 进制的自增 ID 转换成 62 进制字符串,这个字符串就可以唯一标识一个长链接。由于 ID 是自增的,对应的 62 进制字符串是不同的,这样就不会出现一个短链接对应多个长链接的问题,62 个字符排列组合,可以保证短链接是用不完的,就算仅限于 6 位长度标识的短链接,也有 558 亿多种情况,这种算法在网上被称为自增序列算法。
维护自增 ID 主要有以下几种方式:
下面是 62 进制的 encode 与 decode 方法,来自 Base62。
private static String base62(Long b10) { StringBuilder ret = new StringBuilder(); while (b10 > 0) { ret.insert(0, characters.charAt((int) (b10 % 62))); b10 /= 62; } return ret.toString(); } private static long decodeBase62(String b62) { long ret = 0; b62 = new StringBuffer(b62).reverse().toString(); long count = 1; for (char character : b62.toCharArray()) { ret += characters.indexOf(character) * count; count *= 62; } return ret; }
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
顺序的 62 进制为例,当主键大于 56800235583 时,会生成 7 位长度的 62 进制字符串。这个问题可以通过控制自增主键的增长速度来解决,而且要避免主键浪费。0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
的顺序来表示,这个顺序可以是打乱的,这样生成的短链接标识更随机不易被破解。PS:做一次标题党,师承 SCDN 官方
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。