前言:

最近看了一些关于短址(short URL)方面的一些博客,有些博客说到一些好的东西,但是,也不是很全,所以,这篇博客算是对其它博客的一个总结吧。

介绍:

短址,顾名思义,就是把长的 URL 转成短的 URL, 现在提供这种服务的有很多公司,我们以google家的 URL shortener 服务: http://goo.gl/ 为例。

首先我们到 http://goo.gl/,然后把本文博客的地址http://blog.csdn.net/beiyeqingteng 输入进去,最后它会返回一个更短的URL,http://goo.gl/Jfs6q 。如下图所示:



URL 解析:

当我们在浏览器里输入 http://goo.gl/Jfs6q 时,DNS首先解析获得http://goo.gl/的IP地址。当DNS获得IP地址以后(比如:74.125.225.72),会向这个地址发送HTTP GET请求,查询 Jfs6q, 这个时候,http://goo.gl/服务器会把请求通过HTTP 301转到对应的长URL http://blog.csdn.net/beiyeqingteng 。后面的解析过程就和平常网址解析是一样的了。

短址本质:

短址本质上是实现了一个映射函数 f: X -> Y 。而这个映射函数必须同时具有两个特点:

1. 如果 x1 != x2, 则 f (x1) != f(x2);

2. 对于每一个 y, 能够找到唯一的一个 x 使得 f(x) = y;

对于任何的线性函数,比如 f(x) = 2x,都满足这样的条件。

好了,如果了解了短址的本质,我们再来看它是如何实现的。

注明:在google URL shortener 服务中,它允许一个长 url 对应多个短的url。这可能是出于安全上的考虑。在本文中,我们不考虑这种情况。

实现:

短址的长度一般设为 6 位,而每一位是由 [a - z, A - Z, 0 - 9] 总共 62 个字母组成的,所以6位的话,总共会有 62^6 ~= 568亿种组合,基本上够用了。在google URL shortener 服务中,短址长度为 5,大概有9亿多种组合.

假设我们用数据库来保存长地址和短地址的映射,那么,在表 LongtoShortURL 中,我们会有三列:

1. ID,int,  自动增长;

2. LURL,varchar,  // 长URL;

3. SURL, varchar,  // 短URL。

现在我们考虑通过如何长URL得到唯一的短URL。

在讲具体算法以前,先提一个问题:10进制数和16进制数之间的转换是否满足刚刚提到的映射函数 f: X -> Y中的两个条件?

答案: 是。

本文的思路也是利用进制之间的转换。因为我们总共有 62 个字母,我们可以自创一种进制,叫做 62 进制。其规则如下:

[html] view plaincopy
  1. 0  → a
  2. 1  → b
  3. ...
  4. 25 → z
  5. ...
  6. 52 → 0
  7. 61 → 9

所以,对于每一个长地址,我们可以根据它的ID,得到一个6位的 62 进制数,这个6位的 62 进制数就是我们的短址。具体实现如下:

[java] view plaincopy
  1. public ArrayList<Integer> base62(int id) {
  2. ArrayList<Integer> value = new ArrayList<Integer>();
  3. while (id > 0) {
  4. int remainder = id % 62;
  5. value.add(remainder);
  6. id = id / 62;
  7. }
  8. return value;
  9. }

举例:

对于 ID = 138,通过 base62(138), 我们得到 value = [14, 2]。根据上面的对应规则表,我们可以得到其对应的短址为:aaaabn 。(由 value 得到具体的短址,可以通过switch 语句得到,因为代码太长,在此略过。)

当我们想通过短址找到所对应的长地址,方法也很简单,就是把62进制数转成10进制数即可,这样我们就可以得到长地址的ID了。代码如下:

[java] view plaincopy
  1. public static int base10(ArrayList<Integer> base62) {
  2. //make sure the size of base62 is 6
  3. for (int i = 1; i <= 6 - base62.size(); i++) {
  4. base62.add(0, 0);
  5. }
  6. int id = 0;
  7. int size = base62.size();
  8. for (int i = 0; i < size; i++) {
  9. int value = base62.get(i);
  10. id += (int) (value * Math.pow(62, size - i - 1));
  11. }
  12. return id;
  13. }

比如,对于短址aaae9a,其62进制为[0, 0, 0, 4,61,0] ,则其长地址的ID 为[0, 0, 0, 4,61,0] = 0×62^5+ 0×62^4 + 0×62^3 + 4×62^2 + 61×62^1 + 0×62^0 = 1915810。有了ID,我们自然就可以得到长地址了。

参考:http://stackoverflow.com/questions/742013/how-to-code-a-url-shortener (本文算法来源)

http://blog.sina.com.cn/s/blog_65db99840100lg4n.html

转载请注明出处:http://blog.csdn.net/beiyeqingteng

短址(short URL)原理及其实现 来源:http://blog.csdn.net/beiyeqingteng相关推荐

  1. 短址(short URL)原理及其实现

    http://blog.csdn.net/beiyeqingteng/article/details/7706010 URL 解析: 当我们在浏览器里输入 http://goo.gl/Jfs6q 时, ...

  2. 算法高级(38)-短网址(short URL)系统如何实现?

    一.什么是短网址? 我们的URL地址常常会因为需要携带各式各样的参数,或者随着业务增长,变得越来越长.对于用户而言,过长的链接体验必然是不好的.这时候短网址就应用而生了,也称为短链接. 短网址,就是把 ...

  3. 转:短网址(short URL)的实现_如何生成短链接URL?

    什么是短链接 ? 就是把普通网址,转换成比较短的网址.比如:这种http://t.cn/ E70Piib,在微博这些限制字数的应用里.好处不言而喻:短.字符少.美观.便于发布.传播. 我们应该都能想到 ...

  4. 网址短连接 short url

    短连接网址介绍: java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java 百度短连接服务:http://dwz.cn/ 1.百度的短链接域名是dwz.cn 2.百度的短链接 ...

  5. 自动投票器的原理及设计思路 http://blog.csdn.net/lkfstar/archive/2008/01/12/2039070.aspx

    自动投票器的原理及设计思路 ___________________________罗坤凡 2008-01-12 网络投票和平时浏览网页.登陆邮箱一样,都是客户端和网站服务器之间的通讯过程.客户端发出信 ...

  6. Windows Phone 7 - 页面间传值 来源-http://blog.csdn.net/dncts/article/details/6160067

    Windows Phone 7 - 页面间传值 分类: Windows Phone 7 2011-01-23 20:42 441人阅读 评论(0) 收藏 举报 在页面间导航时传递参数的方式大致有3种, ...

  7. [转载] URL短网址生成算法原理

    参考链接: URL 短地址Shorteners及其Python中的API 2 短网址(Short URL),是在形式上比较短的网址,通过映射关系跳转到原有的长网址. 本文转自米扑博客:URL短网址生成 ...

  8. 系统设计 - 短链接系统 short url

    前言 最近看了一些关于短址(short URL)方面的一些博客,有些博客说到一些好的东西,但是,也不是很全,所以,这篇博客算是对其它博客的一个总结吧 什么是短链接 短址,顾名思义,就是把长的 URL ...

  9. 后端面试之系统设计-短网址(Short URL)服务怎么设计?

    首发于微信公众号:[码农在新加坡],欢迎关注. 个人博客网站:后端面试之系统设计-短网址(Short URL)服务怎么设计? 背景 短网址(short url),就是将长网址缩短为一个很短的网址,用户 ...

  10. 短网址(Short URL)服务

    短网址(Short URL)服务,在微博, qq空间等应用中十分常见,比如,当我们在腾讯.新浪微博发微博时有时发很长的网址连接,但由于微博限制字数,所以微博就自动把您发的长网址给转换成短网址了.这样是 ...

最新文章

  1. [RabbitMQ+Python入门经典] 兔子和兔子窝
  2. 分割 标注数据_另辟蹊径,中科院自动化所等首次用图卷积网络解决语义分割难题...
  3. 中间人攻击-http流量嗅探
  4. ubantu获取信息_Ubuntu 下查看CPU 信息命令
  5. 第一个正式的python版本_LeetCode | 0278. First Bad Version第一个错误的版本【Python】...
  6. Windows添加.NET Framework 3.0 NetFx3 失败 - 状态为:0x800f0950
  7. 谁抢光了你的火车票?
  8. ubuntu字体丑_科学网—关于ubuntu系统的一点经验——字体崩溃 - 苗玉虎的博文
  9. android新手上路 一
  10. 微信小游戏制作坦克大战(一)微信小游戏制作工具介绍
  11. oracle adjusting parallel,ora-29740故障求救
  12. TP礼物钻石投票评选男神女神萌娃商家投票系统源码简介下载
  13. python中关于requests里的timeout()
  14. 不到一小时就可用Java做出坦克大战小游戏
  15. 骨传导耳机品牌排行榜前十,目前最好用的几款推荐
  16. Hopefield神经网络
  17. 大数据分析工具Power BI(一):Power BI介绍
  18. BigDecimal精度丢失问题
  19. 什么是白马股,它与蓝筹股有什么区别?
  20. python中文字符串写入文件,python写入中英文字符串到文件的方法

热门文章

  1. JavaScript基本第一天总结
  2. 移动硬盘无法读取是怎么回事?
  3. 网络时钟同步系统概述
  4. dwg如何转换成pdf格式?
  5. 计算机组装方案背景图,白色系主机的另外一种搭配:联力O11MINI装机作业参考...
  6. 云计算技术学习书籍推荐
  7. 阿里系产品Xposed Hook检测机制原理分析
  8. 名编辑电子杂志大师教程 | 仿古书翻页
  9. c语言音频信号频谱分析,音频信号频谱分析(正文)-副本.pdf
  10. ADS3 Inverted File Index