我们都用过这么一个功能,一个非常长的网址,可以被压缩称一个非常短的链接,这背后用到的是什么样的技术呢?背后又隐藏着怎么样的算法与数据结构?我们如何能够快速的进行实现。
短网址技术其实非常的简单,我们可以将这个技术分成两部分,第一部分是长网址的压缩,也就是如何把长连接地址压缩成短连接地址,第二部分是如何把访问短链接地址的时候又重新变成访问长链接地址。
哈希算法
![5ba7899121a0cab6bb4e7da1bceb749d.png](https://i-blog.csdnimg.cn/blog_migrate/a15dcc912943d3a2b4e372cba7f377ee.jpeg)
最常见的短网址实现方案便是使用哈希算法,相信学过算法与数据结构的同学对这个算法并不陌生,哈希算法可以把非常长的文本甚至文件映射成一个字符串或者数字,这种算法并不陌生,我们常见的文件md5算法也属于哈希算法中的一种。
但是md5比较长,通常我们会使用murmurhash来进行哈希,这是一种比较轻量级的哈希算法。我们将哈希后的值跟长连接还有失效时间一起保存在数据库里面,后面通过哈希后的值,就能够找到对应的原始长链接地址了。
但是,这里还存在2个细节问题,首先是哈希地址冲突了怎么办?常见的哈希冲突解决方法,便是从后面一直找,找到一个空的插槽放进去,如果学过算法与数据结构,便知道这种算法比较不稳定,并且实现起来也麻烦。我们有一个更简单的做法,就是在原始链接后面再拼上一个自定义的字符串进行哈希。
![502e4b81d900f3e59fb00f2a883c2b0b.png](https://i-blog.csdnimg.cn/blog_migrate/8f2ed47d8b47424561331a303616fdd8.jpeg)
另外一个问题,便是murmurhash的哈希结果是一个32位的数字,只有0到9组成,如果似乎几千万的一个数字,也比较长,那么我们可以怎么办呢?我们可以把这个简单十进制数字转成更高的进制,把字母a到z与A到Z都用上,就可以把字符串压到非常短了。
重定向
那么如何访问一个短地址的时候变成一个长地址呢?同理也是非常的简单,运用到的便是网页重定向功能。
![fc30314e5fdc1cf78f8eda167e57a93e.png](https://i-blog.csdnimg.cn/blog_migrate/7f7a42d2432415f2fa4a40d4a02ca2ef.jpeg)
用户先使用短地址到后台查询,后台到数据库中进行查询后,便校验数据的合法性,例如数据过期之类的,紧接着返回长地址与重定向错误码,浏览器接受到错误地址后便开始重定向到真实地址。
总结
看,其实只要非常简单的算法跟存储,我们变成制作一个短地址服务器,如果你有兴趣,可以关注我,后面我们会用简单的代码进行实现。欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)