长短链接转换

把一个长链接https://xxx.com?aaa=123&bbb=456转换成一个短链接http://yyy.com/abcd这样的需求是挺常见的,今天写了写这个计算,单纯为了玩耍,离企业应用还差得远

第一反应就是base64,因为看到了短链接里的字母和数字,但是base64越编码越长,所以是不满足要求的,那么就找个对象来存呗,所以我就写了个这样的

  let urlMap = {};
  let alpha = 'abcdefghijklmnopqrstuvwxyz';

  let genCode = function () {
    let temp = '';
    for (let i = 0; i < 12; i++) {
      temp += alpha[Math.floor(Math.random() * 26)];
    }
    if (urlMap.hasOwnProperty(temp)) {
      temp = genCode();
    } else {
      urlMap[temp] = '';
    }
    return temp;
  }

  var encode = function (longUrl) {
    let code = genCode();
    urlMap[code] = longUrl;
    return code;
  };

  var decode = function (shortUrl) {
    return urlMap[shortUrl];
  };

通过genCode生成随机的12位字符串,如果发现这个字符串已经存在了,重新生成,如果不存在,保存为一个key,返回,encode就是生成一个key,往key对应的value里放长链接

刚写完感觉很舒服,很美好,但是想了想,发现有问题,首先,当这个对象里的链接越存越多,需要重新生成字符串的次数也会变多,尤其是字符串的长度设置的比较短并且对象里快要存满的时候,其次,如果这个对象存满了,那么会栈溢出,不友好

想了想,可以用递增的数字来作为key,这样就不会遇到生成相同字符串的问题,如果事先约定了存储的长度,也可以通过对当前使用的数字的大小来检查是否达到了最大长度,只是显示起来可能不好看,并且是有序的

查了一下,比较常见的办法是用多进制来实现,比如0-9和26个小写字母,可以组成36进制,上面的数字通过转换成36进制,就可以又有字母又有数字,并且乍一看不容易看出是有序的

你可能感兴趣的:(杂记)