長短鏈接轉換

把一個長鏈接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進制,就可以又有字母又有數字,並且乍一看不容易看出是有序的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章