「System Design」设计一个短链接系统

97c643f615b65b558918d678b1bee3c2.png

短链接系统可以把比较长的 URL 网址转换成简短的网址字符串,短链接的优势是方便传播。适合在一些对字符串长度有要求的场景中使用,比如短信,微博等,比如

https://www.cnblogs.com/myshowtime/p/16227260.html

转换成短链接为

https://bit.ly/3z0QtB9


   设计要求   

b26c261d57734fd3645beef2dbd7b7ed.png

根据面试的要求,你需要设计一个短链接系统, 链接的长度尽量比较短,每天生成 1 亿个URL,服务要运行 10 年。

首先,我们看一下短链接的工作原理。


   工作原理   

在 Chrome 上输入短链接,会发生什么?

打开开发者工具, 可以看到, 服务器收到请求后,会把短链接转换成长链接,然后返回浏览器,进行 301 重定向,请求到长链接地址。

342114b5e7a3955ff495fe983bfa855f.png

另外一个问题,如何把长链接转换成短链接?

能否使用一些加密算法呢?明显是行不通的,因为字符串加密后会变的更长。

3f8428f132c5157c031d1c39e9c20378.png


   哈希算法   

实际上,我们可以使用哈希算法和哈希表实现,如下

8ed78efa74e0b56518413548c52a8dc8.png

长链接经过哈希算法后, 会生成固定长度的哈希值 key,也就是短链接的值,并保存到哈希表中。

使用短链接查询长链接时,只需要查询哈希表即可。

6e264335e426ffeefcb86954ea4656ef.png

上面是常见的哈希算法,最少也要8位。

那我们需要多少位的短链接呢?根据上面的要求,一天生成一个亿的短链接,运行10年,1亿 * 365 * 10 = 3650 亿。

短链接的字符在 [0-9,a-z,A-Z] 之间,总共 62 个不同的字符,可以计算出下面的数据。

75a2d712fe8b2c203da7fdefe7d4dfb0.png

可以看出,要满足系统要求的话,短链接的长度最少为 7 位。在实际中,很多短链接系统的长度也是 7 位。有兴趣的同学还可以看一下,米勒定律 7±2 法则。

上面的 CRC32 算法,最少也是 8 位。不过我们可以截取前 7 位,最后一位丢弃。但是这样可能会出现哈希冲突的问题,我们可以给长链接递归地拼接一个值,直到不再发现冲突,当然也可以用其他的哈希冲突解决方法。


   Base 62 转换   

这是另外一种常见的方法,Base 62 字符由大写字母 A-Z、小写字母 a-z 和数字 0-9 组成, 总共 62 位,如下

60a3295fcb437b7c74ef0e862ef6a80b.png

base 62 和 base 64 相比,只不过少了2个字符 + 和 /,大家可以想一下,这里我们为什么不用 base 64。

Base 62 和上面的哈希算法的思路是不一样的,哈希算法是根据长链接计算哈希值,然后保存到哈希表中。而 base 62 需要给每条长链接生成一个唯一的数字 ID,如下

0be2b0c1825a1581cc83b50845e09eb8.png

那么如何计算短链接 ShortURL 呢? 因为 Id 是唯一的 10 进制数字,我们只需要把它转成 62 进制即可, 这里和从2进制转换到10进制是一样的。

假如有一个 ID 为 11157, 转换的过程如下

7b0da1dc076de0eb38f27cfbaa1fb6f1.png

最终得到的短链接的值为 https://xxx.com/2TX。

6c6617cb53d436778ac6af3918aaed10.png

   总结   

在本文中,介绍了两种实现短链接的方法,分别是哈希算法和 base 62。

哈希算法的特点是,固定的短链接长度,不需要生成唯一ID,可能会出现哈希冲突。

base 62 转换的特点是,长度不固定,取决于 ID 的大小,1000 转换后是 G8, 1000 亿 转换后是 1l9Zo9o。另外还需要生成唯一数字 ID,没有哈希冲突的问题。

希望对您有用!

译:等天黑

作者:Alex Xu

来源:《System Design Interview》

简介: Alex Xu 是一位经验丰富的软件工程师, 之前曾在 Twitter, Apple 和 Oracle 任职,来自卡内基梅隆大学,热衷于系统设计。

3354382b22428288484dcf5431577620.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之页面有变化用onWindowFocusChanged来监听权限是否开启

1 问题 我们需要在Activity里面监听网络变化、热点是否开启和关闭、GPS服务是否开启、位置权限是否开启等一些列行为。 2 思路 方法一: 如果是需要启动activity进行权限申请,我们可以用如下组合模式 var intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)startA…

iOS中 Animation 动画大全 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang 新浪微博! iOS开发者交流QQ群: 4463102061.iOS中我们能看到的控件都是UIView的子类,比如UIButton UILabel UITextField UIImageView等等 2.UIView能够在屏幕的显示是因为在创建它的时候内部自动添加一个CALa…

IROS 2017上,这些厂商将会给我们展示什么样的黑科技?

相比起大多数AI学术会议,机器人领域最具影响力的学术会议IROS要“好看”得多。在这个学术会议上不仅会有AI和机器人领域最新的研究成果的论文展示,更有不少来自于科研机构和机器人领域公司机器人,向我们展示着展示机器之美。 比如&#xff0c…

《看聊天记录都学不会C#?太菜了吧》(3)变量:我大哥呢?$:小弟我罩着你!

本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将会逐步更新。 若…

linux block设备,Linux I/O Block--块设备的表示

块设备的分区信息由struct hd_struct结构描述,其中最重要的信息就是分区的起始扇区号和分区的大小。所有分区信息都一起保存在gendisk的part_tbl结构中,同时每个分区的block_device也可以通过bd_part来查询对应的分区信息。下图描述了block_device,gendi…

【抢鲜版】ArcGIS 10.7手把手经典图文安装教程(附安装包下载地址)

软件更新真是个快,ArcGIS10.7已经亮相了!回头想想,作者追随ArcGIS已经有11个年头了(从ArcGIS 9.2到ArcGIS10.7,每个版本都抢鲜使用,先睹为快),本文演示10.7完美安装过程(附下载地址),亲测可用! 目 录 一、系统环境要求 二、软件安装过程 三、软件下载地址 一、…

Android之解决ViewPager2+PhotoView滑动图片花屏问题

1 问题 用ViewPager2和开源框架PhotoView(com.github.chrisbanes.photoview.PhotoView)组合实现滑动预览图片, 但是部分机型出现花屏效果 2 原因 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas…

请来围观:WPF开发的微信客户端!!!

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;眾尋原文链接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/6058206.html公司的同事离职了&#xff0c;接下来的日子可能会忙碌&#xff0c;能完善DEMO的时间也会少了&#xff0c;因…

C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅

定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串>比特数组 (1)byte[] btSystem.Text.Encoding.Default.GetBytes("字符串");(2)byte[] btConvert.FromBase64String("字符串"); 补充&#xff1a; System.Text.Encoding.Unicode.GetBytes(str)…

ios-新浪微博-下拉刷新获取最新的消息(解决消息重复的问题)(五)

2019独角兽企业重金招聘Python工程师标准>>> 第一步 在上一篇博文的基础上&#xff0c;利用新浪提供的since_id进行判断&#xff0c;在刷新监听的方法中&#xff0c;引入下面的代码 结果如下图 转载于:https://my.oschina.net/iOSliuhui/blog/520495

sqlserver快速查找所有存储过程中是否包含某字符

--将text替换成你要查找的内容 select name from sysobjects o, syscomments s where o.id s.id and text like %text% and o.xtype P --将text替换成你要查找的内容 SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LI…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(7)我用函数写了个特洛伊木马

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

【经典回放】多种语言系列数据结构算法:队列(C版)

一、队列ADT以及C语言实现 1 队列的原理以及ADT分析 队列是说:把一些数据按先进先出来组织,如同日常生活中的排队过程。 队列最主要的操作是 <1> 数据加入队列;<2> 从队列中取出数据; 加入队列只能加入到队列尾巴上,而从队列中取出数据、则只能是取出队列…

linux修改windows注册表,妙招:让修改的注册表立即生效的几种方法

建站学院(LieHuo.Net)Windows文档Windows操作系统是全球最广泛&#xff0c;使用者最多的软件&#xff0c;熟悉Windows软件成了电脑操作者必不可少的功课&#xff0c;注册表作为“Windows的神经系统”非常重要&#xff0c;相信很多朋友都非常熟悉注册&#xff0c;在开始&#xf…

Android之通过用户名和密码连接指定wifi热点(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1问题)

1 需求 通过用户名和密码连接指定wifi热点,网上的代码乱七八糟,没几个可以用,我这边整理了下,测试了华为Android9.0和小米Android9.0和10.0和OPPO Android9.0 都没问题,直接回调结果就行。 2 问题 在Android10.0手机上 mWifiManager.addNetwork(wifiNewConfiguration);…

hdu 4530(数学)

小Q系列故事——大笨钟 Time Limit: 600/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1458 Accepted Submission(s): 734 Problem Description饱尝情感苦恼的小Q本打算隐居一段时间&#xff0c;但仅仅在3月25号一天没有出现&am…

WPF怎么做新手引导界面?

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;眾尋原文链接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/8391864.html这两天不忙&#xff0c;所以&#xff0c;做了一个简易的新手引导小Demo。因为&#xff0c;不是项目上应用&a…

最全js表单验证

/***************************************************************** 表单校验工具类 (linjq) *****************************************************************//** * 判断整数num是否等于0 * * param num * return * author jiqinlin */function isIntEqZero(num){ r…

《看聊天记录都学不会C语言?太菜了吧》(19)巩固开始,数字1、2、3、4能够组成多少个 3 位数的不同的排列

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

阿里云MaxCompute香港开服 将引入更多人工智能服务

9月18日&#xff0c;阿里云宣布大数据计算服务MaxCompute在香港正式开服。通过MaxCompute强大的计算能力&#xff0c;阿里云将为香港市场提供更多的人工智能产品&#xff0c;助力当地企业智能化升级。据了解&#xff0c;MaxCompute向用户提供了完善的数据导入方案以及多种经典的…