前提
又到了一月一度的清理消息的时候了,开始清理短信,忽然见到一个幸福里的通知短信,那是在短信到达之前,本打肿脸充胖子在`幸福里小程序`里面咨询上海的一套二手房的价格的,后来没关注,这个短链接 引起了本兴趣.
如何去实现一个短链接服务?
幸福里通知短信
短链接的原理
娜娜项目网每日更新创业和副业项目
网址:nanaxm.cn 点击前往娜娜项目网
站 长 微 信: nanadh666
短链接的核心是什么? 构建的短链接和长链接(我们真实的访问地址)的唯一关联映射、也就是映射标识生成算法。
从这个定义也能得到短链接服务的几个特点:
拆解短链接
的短链接,我掏出了我的神器 Chrome 打开了一下,直接跳转到了. 好了仔细看一下请求和响应链接,响应的302,响应头中带了需要跳转的地址.
综合上面的,总结出的示意图:
可以看出来,构建唯一映射关系是将原有的固定长链接生成一个或多个短链接,`1:N`关系。
生成的短链接必须满足:
为什么要求长度尽量短?
回到这个唯一映射关系上来,就是需要对这个长链接做 `Hash`,和大多数哈希算法一致,生成算法需要就是要具备唯一性和较低的碰撞率的特点,而在短链接场景下,又决定了它还要具备短线精悍并且易于传输的特点。
短链接压缩生成算法特点:
短链接生成算法
从上图可以看出,协议、域名 均为不可变部分,能定制的只有 压缩码(哈希码), 那么作为程序能玩的也只有这部分了。
回到幸福里通知短信的短链接, 它抛掉协议和域名两部分,还剩下 s/vdwecR , 可以看出 Path 其实是两层,第一层是 s ,第二层是 vdwecR ,
可以抽象为 {pathLevel1}/{pathLevel2} , {pathLevel1} 为了简短使用了 单个字母(可以区分大小写)或者数字, {pathLevel2}为了满足低碰撞率和唯一性,使用了 6位区分大小写字母和数字的组合体。那么像这个组合体的最大组合数量是多少呢?{pathLevel1} 假设只有一位, {pathLevel2} 有6位,从当前的例子来看,不考虑取值为数字的可能,那么它的组合数是每个取值都是(26个大写字母 + 26个小写字母),也就是 52 ^ 7 = 1,028,071,702,528 ,已达万亿级别数量级。
现在我做个假设,我们只实现有一个级别的 path , 每个字符串的取值为(26个大写字母 + 26个小写字母 + 10 个数字),那么这个组合数就看位数 N 了: 62 ^ N 为组合数数量级
可以看出,组合数越小的数量级别越小,破解的难度越小,组合数越大,破解的难度越难。
从我的`机`历史的短信上,看 4、5、6 、7 的短链接都有,大部分的还是 6 ,现在决定选型: 选择 6 位作为组合位的位数。现在我把这个6位的随机串叫做 压缩码
好了,下面开始设计了,只需要解决两个问题就设计完成:
如何解决压缩码的生成?
在考虑如何生成压缩码的时候,我讨巧了一下链接,也是借助样例子做了个拓展,62进制的字符串刚好由 `0-9`, `A-Z`, `a-z` 组成,在这方面只需要做一件事, 直接生成一个唯一的 十进制数 ,最后直接转换为 62进制数 即可
10进制 数的生成方式:
如何解决映射问题?
压缩码生成后如何生成短链接?这边采用最简单的方式,直接协议拼接生成,压缩码直接消耗掉(后面考虑回收压缩码的问题)。长链接和压缩码直接关联映射(1:M). M的数量看需求服务方要求。
拓展问题: 压缩码共享(多个短链接域名)
综上下图是短链接映射实现图:
短链接换长链接时序图:
短链接服务的技术实现
开源项目: [corgi]()
备注,wait coding
地址
博客原文: 短链接的思考与技术实现
公众号文章:
娜娜项目网每日更新创业和副业项目
网址:nanaxm.cn 点击前往娜娜项目网
站 长 微 信: nanadh666