short url短鏈接原理


一、什么是短鏈接

  含義:就是把普通網址,轉換成比較短的網址。比如:http://t.cn/RlB2PdD 這種,比如:微博;這些限制字數的應用里都用到這種技術。

  優點:短、字符少、美觀、便於發布、傳播。

  百度短網址:http://dwz.cn/

  google短網址: https://goo.gl/

二、原理分析

  當我們在瀏覽器里輸入 http://t.cn/RlB2PdD 時會經歷以下及格步驟:

  1.瀏覽器解析DNS,獲取域名對應的IP;

  2.當獲取到IP時,會往這個IP地址發送http的get請求以獲取到RlB2PdD對應的長鏈接地址;

  3.HTTP通過301轉到對應的長鏈接URL;

  注意:這里為什么使用301?301是永久性轉移(重定向),也就是說,這個短地址一經生成就不會發生變化了,所以符合http中301的一個語義;

三、算法實現

  短地址一般都是由0-9A-Za-z這62個字符隨機組合而成,所以我們可以生成一個62進制的串,可以根據10進制數轉成62進制數;比如咱們存儲數據庫的時候自增的id,就可以根據這個id來生成對應的62進制的短碼,作為短鏈接的碼數,最長6位、最短1位,以下是實現的方法僅供參考: 

/***
 * 10進制轉為62進制
 * @param $num
 * @return string
 */
function from10_to62($num) {
    $to = 62; // 0-9a-zA-Z總計62個字符
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // 這個可以打亂順序
    $ret = '';
    do {
        $ret = $dict[$num%$to] . $ret; // 取模
        $num = floor($num/$to); // 取余數
    } while ($num > 0);
    return $ret;
}

/***
 * 62進制轉為10進制
 * @param $num
 * @return int|string
 */
function from62_to10($num)
{
    $from = 62;
    $num = strval($num);
    $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $len = strlen($num);
    $dec = 0;
    for ($i = 0; $i < $len; $i++) {
        $pos = strpos($dict, $num[$i]); // 查找字符出現得位置 16
        $bcpow = bcpow($from, $len - $i - 1); // 取62得N次方(保留整數)
        $bcmul = bcmul($bcpow, $pos); // 計算每個62進制字符得10進制值
        $dec = bcadd($bcmul, $dec); // 計算的值累加
    }
    return $dec;
}

var_dump(from10_to62(1000));
var_dump(from62_to10('g8'));

  內容參考自:https://hufangyun.com/2017/short-url/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM