1、什麼是短連接算法
含義:就是把普通網址,轉換成比較短的網址。好比:http://t.cn/RlB2PdD 這種,好比:微博;這些限制字數的應用裏都用到這種技術。數據庫
優勢:短、字符少、美觀、便於發佈、傳播。瀏覽器
百度短網址:http://dwz.cn/google
google短網址: https://goo.gl/url
2、原理分析spa
當咱們在瀏覽器裏輸入 http://t.cn/RlB2PdD 時會經歷如下及格步驟:code
1.瀏覽器解析DNS,獲取域名對應的IP;blog
2.當獲取到IP時,會往這個IP地址發送http的get請求以獲取到RlB2PdD對應的長連接地址;get
3.HTTP經過301轉到對應的長連接URL;string
注意:這裏爲何使用301?301是永久性轉移(重定向),也就是說,這個短地址一經生成就不會發生變化了,因此符合http中301的一個語義;
3、算法實現
短地址通常都是由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/