当前位置:网站首页>短链的设计
短链的设计
2022-07-06 15:51:00 【OoZzzy】
目前在很多场景下,都需要短链,尤其是涉及到一些 URL 下发的逻辑。之前做小马 AI 课的业务时,销售通过短信下发的链接就是一个短链。为什么需要短链呢?考虑到一个 URL 上有 path、query 等参数,各种参数拼接在一起就成了一个长的字符串。
1.短链组成
协议 + 域名 + path
,协议可以直接忽略。域名是必须的(废话),并且足够短,否则的话就变成了长的短链(挺傻的)。最后 path 的部分才是关键,看起来是一个由 6 个字符组成的字符串,并且字符的范围是大小写字母+数字。
2.Path 的生成
2.1 哈希算法
Path 的其中一种方式就是通过哈希算法计算得到。常见的哈希函数有 MD5、SHA1 等大家常见的加密型哈希算法,也有 HighwayHash、MurmurHash 等非加密型哈希函数。以 MurmurHash 为例,目前已经迭代到 MurmurHash 3,能够产生 32bit 和 128 bit 的哈希值,并且对于规律性较强的 key,随机分布的特征表现的很不错。
不过哈希冲突是不可控的,我们虽然有 N 种解决哈希冲突的方式,但是会增加整个系统的整体复杂度。
2.2 自增 ID
也可以维护一个 ID 自增生成器,对于每一个长链生成1、2、3等自增的序号,然后把长链和序号的映射保存在数据库里面,然后得到如 https://fake.short/1、https://fake.short/2 等短链。考虑到单机容易造成单点故障,所以一般都是分布式的 ID 生成器。
- Mysql
- SnowFlake
- UidGenerator 百度
- Leaf 美团
2.3 进一步缩短
如果我们得到『1536389934』这个序号的话,看起来还是有点长,如果想进一步缩短,可以把十进制数转换成62进制数。然后就得到一个比原序号更短的 ID 了。
为什么要用62进制转换?
62进制转换是因为62进制转换后只含数字+小写+大写字母。而64进制转换会含有/,+这样的符号(不符合正常URL的字符)encodeURIComponent(‘+’) => %xx
10进制转62进制可以缩短字符,如果我们要6位字符的话,已经有560亿个组合了。
边栏推荐
- 这个『根据 op 值判断操作类型来自己组装 sql』是指在哪里实现?是指单纯用 Flink Tabl
- [launched in the whole network] redis series 3: high availability of master-slave architecture
- Let me ask you if there are any documents or cases of flynk SQL generation jobs. I know that flynk cli can create tables and specify items
- 今日睡眠质量记录78分
- Example code of MySQL split string as query condition
- Children's pajamas (Australia) as/nzs 1249:2014 handling process
- Where does this "judge the operation type according to the op value and assemble SQL by yourself" mean? It means simply using Flink tab
- Can async i/o be implemented by UDF operator and then called by SQL API? At present, it seems that only datastre can be seen
- AcWing 4299. Delete point
- How to implement Lua entry of API gateway
猜你喜欢
Ajout, suppression et modification d'un tableau json par JS
同构+跨端,懂得小程序+kbone+finclip就够了!
Cover fake big empty talk in robot material sorting
Daily question brushing record (XV)
koa2对Json数组增删改查
MySQL中正则表达式(REGEXP)使用详解
Thinkphp5 multi table associative query method join queries two database tables, and the query results are spliced and returned
企业不想换掉用了十年的老系统
AI金榜题名时,MLPerf榜单的份量究竟有多重?
Per capita Swiss number series, Swiss number 4 generation JS reverse analysis
随机推荐
Example code of MySQL split string as query condition
Word2vec (skip gram and cbow) - pytorch
Dockermysql modifies the root account password and grants permissions
The method of reinstalling win10 system is as simple as that
AI表现越差,获得奖金越高?纽约大学博士拿出百万重金,悬赏让大模型表现差劲的任务...
今日睡眠质量记录78分
B 站弹幕 protobuf 协议还原分析
One minute to learn how to install the system, win7 XP, win10 and win11 become very simple
请问async i/o可以由udf算子实现然后用sql api调用吗?目前好像只看到Datastre
资产安全问题或制约加密行业发展 风控+合规成为平台破局关键
Interview question: AOF rewriting mechanism, redis interview must ask!!!
How can Oracle CDC deserialize with jsondebeziumdeserializationschema
自动更新Selenium驱动chromedriver
flinksql select id ,count(*) from a group by id .
同一个作业有两个source,同一链接不同数据库账号,为何第二个链接查出来的数据库列表是第一个账号的
(DART) usage supplement
Up to 5million per person per year! Choose people instead of projects, focus on basic scientific research, and scientists dominate the "new cornerstone" funded by Tencent to start the application
The worse the AI performance, the higher the bonus? Doctor of New York University offered a reward for the task of making the big model perform poorly
这个『根据 op 值判断操作类型来自己组装 sql』是指在哪里实现?是指单纯用 Flink Tabl
The application of machine learning in software testing