• 短链系统设计-用户自定义短链


    5 用户自定义短链接

    实现一个顾客短网址,使得顾客能创立他们自己的短网址。即你需要在前文基础上再实现一个 createCustom

    需实现三个方法:

    • long2Short(url) 把一个长网址转换成一个以http://tiny.url/开头的短网址
    • short2Long(url) 把一个短网址转换成一个长网址
    • createCustom(url, key) 设定一个长网址的短网址为 http://tiny.url/ + key

    注意:

    1. long2Short 生成的短网址的key的长度应该等于6 (不算域名和反斜杠)。 可以使用的字符只有 [a-zA-Z0-9]。如: abcD9E
    2. 任意两个长的url不会对应成同一个短url,反之亦然
    3. 如果 createCustom 不能完成用户期望的设定, 那么应该返回 "error", 反之如果成功将长网址与短网址对应,应该返回这个短网址

    5.1 基于 Base62

    在URLTable里,直接新增一列custom_url记录对应的custom url是否可行?

    不可行!对于大部分数据,该列其实都为空,就会浪费存储空间。

    新增一个表,存储自定义 URL:CustomURLTable。

    创建自定义短链接:在 CustomURLTable 中查询和插入

    根据长链接创建普通短链接:

    • 先查询CustomURLTable是否存在
    • 再在URLTable查询和插入

    同前文一样,用两个哈希表处理长网址和短网址之间的相互映射关系。需额外处理的是用户设定的网址与已有冲突时,需返回 “error”。注意:若用户设定的和已有恰好相同,则同样应该返回短网址。

    public class TinyUrl2 {
        private HashMap<String,String> s2l = new HashMap<String,String>();
        private HashMap<String,String> l2s = new HashMap<String,String>();
        private int cnt = 0;
        private final StringBuffer tinyUrl = new StringBuffer("http://tiny.url/");
        private final String charset = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM";
        
        private String newShortUrl() {
            StringBuffer res = new StringBuffer();
            for (int i = 0, j = cnt; i < 6; i++, j /= 62)
                res.append(charset.charAt(j % 62));
            cnt++;
            return tinyUrl + res.toString();
        }
        
        /*
         * @param long_url: a long url
         * @param key: a short key
         * @return: a short url starts with http://tiny.url/
         */
        public String createCustom(String long_url, String key) {
            String short_url = tinyUrl + key;
            if (l2s.containsKey(long_url)) {
                if (l2s.get(long_url).equals(short_url))
                    return short_url;
                else
                    return "error";
            }
            if (s2l.containsKey(short_url))
                return "error";
            l2s.put(long_url, short_url); 
            s2l.put(short_url, long_url);
            return short_url;
        }
    
        /*
         * @param long_url: a long url
         * @return: a short url starts with http://tiny.url/
         */
        public String longToShort(String long_url) {
            if (l2s.containsKey(long_url))
                return l2s.get(long_url);
            String short_url = newShortUrl(); 
            l2s.put(long_url, short_url); 
            s2l.put(short_url, long_url);
            return short_url; 
        }
    
        /*
         * @param short_url: a short url starts with http://tiny.url/
         * @return: a long url
         */
        public String shortToLong(String short_url) {
            if (s2l.containsKey(short_url))
                return s2l.get(short_url);
            return "error";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    5.2 基于随机生成算法

    无需做任何改动,直接把custom url当short url创建即可!

    参考

    • https://www.zhihu.com/question/29270034
  • 相关阅读:
    图形界面四则运算计算器(Python+PyQt5)
    大数据Flink(一百零二):SQL 聚合函数(Aggregate Function)
    隆云通五要素微气象仪
    用动态规划求解均分纸牌
    java项目运行时信息获取
    注解@PostConstruct分析
    Mybatis之动态sql和分页
    Java高级编程day22【谷】
    YBT 1.1 贪心算法
    算法通过村第七关-树(递归/二叉树遍历)白银笔记|递归实战
  • 原文地址:https://blog.csdn.net/qq_33589510/article/details/126834262