2018-03-09 15:19:04

TinyURL,短地址,或者叫短链接,指的是一种互联网上的技术与服务。此服务可以提供一个非常短小的URL以代替原来的可能较长的URL,将长的URL地址缩短。

用户访问缩短后的URL时,通常将会重定向到原来的URL。

大多数的URL缩短服务都提供有API。URL缩短服务在Twitter等一些每条消息有字数限制的微博客及其他社交网络中有广泛的使用。

一、TinyURL的兴起原因

由于某些类似于Twitter的微博客服务对于每条贴子或消息有字数限制(多为140字)。某些BBS文章超过一行78个字符时,也会造成一些会自动为网址加上超链接的Telnet及BBS软件无法正确运行该动作,因此需要通过缩短网址的功能来达到网址缩短的目的。

缩址另外也有方便用户记忆及发送网址的功能,短址可将太长的网址转换成15个字以内的替代网址,也有部分网站提供自定义名称以及密码保护的功能,可以让用户获取更有自己风格的短网址。

二、实现算法

问题描述:实现一个算法,将长地址转成短地址。实现长和短一一对应。然后再实现它的逆运算,将短地址还能换算回长地址。

问题求解:

方法一、使用最简单的列表来进行保存,当前的附加位就是其在列表中的序号。这种方法可以很容易的实现长短的转换,但是也有明显的不足。

  • 如果我们对同一URL多次进行申请,可以得到多个不同的短链接,这无疑会造成浪费。
  • 使用者可以发现已经有多少URL进行过转换了,这个信息是我们不希望用户得到的。
  • 或许有人会为了得到一个喜欢的数字,反复不断的进行申请
  • 如果仅仅使用数字的话,那么6位数字的表达能力是很差的,最多也就是百万级别,如果加入字母的话效果会好很多。
class Codec:

    def __init__(self):
self.urls = [] def encode(self, longUrl):
self.urls.append(longUrl)
return 'http://tinyurl.com/' + str(len(self.urls) - 1) def decode(self, shortUrl):
return self.urls[int(shortUrl.split('/')[-1])]

方法二、

针对上面提出的各种问题,我们在方法二中会一一解决。

首先是重复问题,对于已经生成的短链接,我们会维护一个longToTiny的hash表,如果当前的长链接已经出现了,那么就直接返回之前生成的TinyURL。

然后是数字的信息泄漏问题,我们这里使用随机数的方法来生成6位的随机数,这里的6位能表达的范围位62^6,是个非常庞大的数字。

最后是使用随机数可能会生成一样的序列,于是采用一个Set来保存已经出现的序列,直到生成未出现的序列。

public class TinyURL {
Map<String, String> tinyToLong = new HashMap<String, String>();
Map<String, String> longToTiny = new HashMap<>();
Set<String> flag = new HashSet<>(); // Encodes a URL to a shortened URL.
public String encode(String longUrl) {
if (longToTiny.containsKey(longUrl)) return longToTiny.get(longUrl);
String code = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String base = "http://tinyurl.com/";
String key = "";
do {
for (int i = 0; i < 6; i++) {
key += code.charAt((int)Math.random() * code.length());
}
} while (flag.contains(key));
flag.add(key);
tinyToLong.put(base + key, longUrl);
longToTiny.put(longUrl, base + key);
return base + key;
} // Decodes a shortened URL to its original URL.
public String decode(String shortUrl) {
return tinyToLong.get(shortUrl);
}
}

TinyURL的更多相关文章

  1. 短地址TinyURL的API使用

    TinyURL的短地址服务超过10年了,很稳定,官方没有给出API连接,其实很简单: API: 调用:http://tinyurl.com/api-create.php?url=http://URL, ...

  2. TinyURL缩短网址服务 - Blog透视镜

    TinyURL是个缩短网址服务的网站,提供1个短网址转向指定到长网址,像是杂志书籍中若有网址太长,也都会用TinyURL来缩短网址,例如本篇文章:http://blog.openyu.org/2014 ...

  3. [leetcode-535-Encode and Decode TinyURL]

    TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi ...

  4. [LeetCode] Design TinyURL 设计精简URL地址

    Note: For the coding companion problem, please see: Encode and Decode TinyURL. How would you design ...

  5. [LeetCode] Encode and Decode TinyURL 编码和解码精简URL地址

    Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL sho ...

  6. Encode and Decode TinyURL

    TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi ...

  7. Leetcode: Encode and Decode TinyURL

    Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL sho ...

  8. 短网址服务(TinyURL)生成算法

          前不久做了一个优惠劵的分享功能,其中一个功能就是生成一个优惠劵分享短链接.生成的短链接要求每个链接都是唯一的,并且长度尽可能短.在网上查了一下相关的思路,发现了一个不错的算法.这个算法的思 ...

  9. 【Leetcode】535. Encode and Decode TinyURL

    Question: TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/pro ...

随机推荐

  1. 从零打造在线网盘系统之Struts2框架配置全解析

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  2. Oracle HA 之 oracle 11.2 rac库配置active dataguard

    目录 configing active dataguard for 11.2 rac. 1 一.建组.建用户.配置环境变量.内核参数等... 1 二.配置共享磁盘... 3 1)创建4块共享磁盘并fd ...

  3. nginx 下使用 bootstrap 字体的问题

    使用boostrap时,出现 glyphicons-halflings-regular.ttf glyphicons-halflings-regular.woff glyphicons-halflin ...

  4. python调用API

    相信做过自动化运维的同学都用过API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍Python中调用API的几种方式,下面是 ...

  5. 使用jackson工具类把对象或集合转为JSON格式

    jackson使用方法: 1.加入jar包: jackson-annotations-2.2.2.jar jackson-core-2.2.2.jar jackson-databind-2.2.2.j ...

  6. mysql索引之主键索引

    MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引 二.语句 CREATE TABLE table_name[col_name data type] [ ...

  7. 《大话设计模式》ruby版代码:外观模式

    需求: 股民买卖股票 初步代码: # -*- encoding: utf-8 -*- #股票1 class Stock1 def buy puts '股票1买入' end def sell puts ...

  8. numpy模块学习笔记

    # encoding=utf-8 import numpy as np from numpy.linalg import * def main(): # 1.最基本的array lst = [[1, ...

  9. JDBC 连接Oracle 数据库,JDBC 连接Mysql 数据库

    首先是JDBC 连接Oracle  数据库 package com.util; import com.pojo.UserInfo; import java.sql.*; public class DB ...

  10. OpenResty api 网关

    1,Orange网关 Orange是一个基于OpenResty的API网关.除Nginx的基本功能外,它还可用于API监控.访问控制(鉴权.WAF).流量筛选.访问限速.AB测试.动态分流等.它有以下 ...