专业的JAVA编程教程与资源

网站首页 > java教程 正文

字节一面-如何实现短链接转换服务

temp10 2025-03-20 19:02:41 java教程 5 ℃ 0 评论

字节跳动一面,经常被问到,短链服务如何设计。问题看似简单,但很多设计细节处都能展开很多知识点,本文将对短链设计方案做详细的剖析,给大家提供几种不同的短链设计思路。

一、为什么要用短链

这种营销短信,大家一般都收到过因短信通道是超过一定字数会加收短信费用(文案总字数超过70个字,那就算两条短信计费,超过140个字就算三条短信计费),也为了更好的观看体验,营销短信中的链接一般都比较短,用户点击短链可跳转到对应的长链接

二、短链设计基本要求

1、通过长链接 生成短链接;点击短链,可重定位跳转到对应的长链

2、短链接满足安全性,即不会将商品id等信息漏出

3、支持有效期限制,例如活动链接,短链接只在有效期内有效

4、不可重复,不同长链接转换的短链接不允许重复

5、支持高并发高负载,防屏蔽防拦截稳定性(SLA)

三、转换算法

1、MD5/SHA算法

1)将原始长链接进行MD5/SHA加密,若防止算法泄露,可在原始链接上添加自定义密钥;

2)将128分成4组,每组32位对应一个候选短链接;

3)每一个候选短链接,将它与0x3FFFFFFF进行位与运算,取其低30位的数据。把得到的值与0x0000003D进行位与运算,再把得到的结果作为下标在字符表中选取字符,再把原数字右移5位进行相同操作,重复进行6次得到6个字符,即组成一个候选短链接地址;

4)在4个候选短链接中,选取一个作为最终短链接,并把长、短链接的映射关系存到数据库中。

对于MD5/SHA算法,这样做有点儿杀鸡用牛刀了。对于短链转换服务来说,由于加密会带来的性能损耗,其实我们并不关心解密的难度,反而我们更关心的是怎样提升哈希的运算速度和降低冲突概率。

2、MurmurHash算法

MurmurHash 是一种非加密型哈希函数,适用于一般的哈希检索操作。与其它流行的哈希函数相比,对于规律性较强的 key,MurmurHash 的随机分布特征表现更良好。非加密型哈希函数意味着着相比 MD5,SHA 这些函数它的性能更高(十倍以上),也正是由于它的这些优点,它目前已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。

为了让链接转换的尽量短,可选择32bit的Murmur哈希值,32bit能表示近43亿的最大值,对于中小型公司绰绰有余。我们可以直接将长链接做MurmurHash计算,得到哈希值,然后通过固定短链域名+哈希值的方式,得到短链接。

3、Base 62自增序列算法

短链接标识一般是 [0-9, a-z, A-Z] 随机组合而成的字符串,字符一共有 62 个,因此短链接标识可以用 62 进制的字符串表示。生成短链仅需要简单两步。1)维护一个自增id;2)将10进制的自增id转换成62进制字符串,这个字符串便可以标识唯一的长链接。

由于id是自增且唯一的,故62进制字符串也是不同的。62 进制字符串可支持6位长度的短链接558亿种组合。

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

1)数据库主键自增

2)redis 自增

3)分布式自增主键 ID(雪花算法,存在 ID 浪费)

关于id自增详细介绍,可参照文章大厂分布式id生成策略揭秘

可做如下优化:

1)当自增主键很大时,生成的 62 进制字符串会变长,当主键大于 56亿+时,会生成 7 位长度的 62 进制字符串。我们可以通过控制自增主键的增长速度来解决,同时要避免主键浪费。

2)62 进制的顺序可以不严格按照
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 的顺序来表示,打乱这个顺序再生成短链接标识,可使短链更随机不易被破解。

3)为保证一个长链接对应唯一一个短链接需求,可以将长链接进行 md5 加密并存储在 DB /redis中,并设置有效期。每次生成短链接前都根据长链接 md5 值查询 DB/redis,如果存在,则直接返回短链接。

4)使用302重定向跳转。301 是永久重定向,302 是临时重定向。选择 302 虽然会增加服务器压力,但可统计到短链接被点击的次数,而这个数据是一个非常有用的大数据分析数据源。

5)如果短链接请求频繁,可以借助 redis 做对应的缓存优化。

总结

本文对短链设计方案作了详细地剖析,旨在给大家提供几种不同的短链设计思路,很多本文涉及到的知识点,文中没有展开讲,建议大家回头可以再详细了解一下。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表