<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          短網址(short URL)系統的原理及其實現

          時間:?2017-11-21閱讀:?1973標簽:?url

          背景

          提供一個短址服務
          你有沒有發現,我們的任務中出現長 URL 就會比較麻煩?如果有一個短址生成器就好了。雖然市面上有很多,但是我們可以重復發明一個輪子,利用這個機會嘗試一下簡單的 Web 全棧開發。

          任務

          做一個短鏈接生成器,可以將一個長鏈接縮短成一個短鏈接。

          要發車了

          發車前,和大家說一下

          如果不想重復的造輪子,想開箱即用,可以使用基于 PHP 的開源軟件 YOURLS。YOURLS 還可以和 WordPress 整合到一起,功能強大,可擴展性高。

          本文記錄了開發短網址系統的整個過程,包括初期的算法調研、模塊設計、數據庫設計、功能擴展等。

          什么是短鏈接

          就是把普通網址,轉換成比較短的網址。比如:http://t.cn/RlB2PdD 這種,在微博這些限制字數的應用里。好處不言而喻。短、字符少、美觀、便于發布、傳播。

          百度短網址 http://dwz.cn/
          谷歌短網址服務 https://goo.gl/ (需科學上網)號稱是最快的 


          原理解析

          當我們在瀏覽器里輸入 http://t.cn/RlB2PdD 時

          DNS首先解析獲得 http://t.cn 的 IP 地址

          當 DNS 獲得 IP 地址以后(比如:74.125.225.72),會向這個地址發送 HTTP GET 請求,查詢短碼 RlB2PdD

          http://t.cn 服務器會通過短碼 RlB2PdD 獲取對應的長 URL

          請求通過 HTTP 301 轉到對應的長 URL https://m.helijia.com 。

          這里有個小的知識點,為什么要用 301 跳轉而不是 302 吶?

          301 是永久重定向,302 是臨時重定向。短地址一經生成就不會變化,所以用 301 是符合 http 語義的。同時對服務器壓力也會有一定減少。
          但是如果使用了 301,我們就無法統計到短地址被點擊的次數了。而這個點擊次數是一個非常有意思的大數據分析數據源。能夠分析出的東西非常非常多。所以選擇302雖然會增加服務器壓力,但是我想是一個更好的選擇。

          來自知乎 iammutex 的答案


          算法實現

          網上比較流行的算法有兩種 自增序列算法、 摘要算法

          算法一

          自增序列算法 也叫永不重復算法

          設置 id 自增,一個 10進制 id 對應一個 62進制的數值,1對1,也就不會出現重復的情況。這個利用的就是低進制轉化為高進制時,字符數會減少的特性。

          如下圖:十進制 10000,對應不同進制的字符表示。

          短址的長度一般設為 6 位,而每一位是由 [a - z, A - Z, 0 - 9] 總共 62 個字母組成的,所以 6 位的話,總共會有 62^6 ~= 568億種組合,基本上夠用了。

          哈哈,這里附上一個進制轉換工具 http://tool.lu/hexconvert/ 上圖的數據就是用這個工具生成的。

          具體的算法實現,自行谷歌。

          算法二

          將長網址 md5 生成 32 位簽名串,分為 4 段, 每段 8 個字節

          對這四段循環處理, 取 8 個字節, 將他看成 16 進制串與 0x3fffffff(30位1) 與操作, 即超過 30 位的忽略處理

          這 30 位分成 6 段, 每 5 位的數字作為字母表的索引取得特定字符, 依次進行獲得 6 位字符串

          總的 md5 串可以獲得 4 個 6 位串,取里面的任意一個就可作為這個長 url 的短 url 地址

          這種算法,雖然會生成4個,但是仍然存在重復幾率

          兩種算法對比

          第一種算法的好處就是簡單好理解,永不重復。但是短碼的長度不固定,隨著 id 變大從一位長度開始遞增。如果非要讓短碼長度固定也可以就是讓 id 從指定的數字開始遞增就可以了。百度短網址用的這種算法。上文說的開源短網址項目 YOURLS 也是采用了這種算法。源碼學習

          第二種算法,存在碰撞(重復)的可能性,雖然幾率很小。短碼位數是比較固定的。不會從一位長度遞增到多位的。據說微博使用的這種算法。

          我使用的算法一。有一個不太好的地方就是出現的短碼是有序的,可能會不安全。我的處理方式是構造 62進制的字母不要按順序排列。因為想實現自定義短碼的功能,我又對算法一進行了優化,下文會介紹。


          流程圖

          自增序列算法流程圖

          開始輸入網址查詢數據庫是否存在對應的短碼返回對應的短碼返回短網址結束保存輸入的網址到數據庫根據id計算對應的短碼更新短碼到數據庫yesno

          自增序列算法 + 用戶自定義短碼 流程圖


          百度短網址還允許用戶自定義短碼,算法二 摘要算法,不和 id 綁定,好像挺好實現這個功能的。

          但是自增序列算法是和 id 綁定的,如果允許自定義短碼就會占用之后的短碼,之后的 id 要生成短碼的時候就發現短碼已經被用了,那么 id 自增一對一不沖突的優勢就體現不出來了。

          那么怎么實現自定義短碼吶?

          我是這樣處理的:

          數據庫增加一個類型 type 字段,用來標記短碼是用戶自定義生成的,還是系統自動生成的。
          如果有用戶自定義過短碼,把它的類型標記自定義。每次根據 id 計算短碼的時候,如果發現對應的短碼被占用了,就從類型為自定義的記錄里選取一條記錄,用它的 id 去計算短碼。
          這樣既可以區分哪些長連接是用戶自己定義還是系統自動生成的,還可以不浪費被自定義短碼占用的 id

          我保留了 1 到 2 位的 短碼,從三位的短碼開始生成的。就像域名的保留域名一樣,好的要自己預留

          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/137

          angularjs如何獲取url參數?

          Angular中通過$location獲取URL參數。$location服務負責解析瀏覽器地址欄中的URL(基于window.location),以便你的應用可以訪問它。 這是一個雙向同步機制 —— 對地址欄URL的任何修改都會被映射到$location服務中

          網頁外鏈用了 target=_blank,結果悲劇了

          今天給大家分享一個 Web 知識點。如果你有過一段時間的 Web 開發經驗,可能已經知道了。不過對于剛接觸的新手來說,還是有必要了解一下的。我們知道,網頁里的a標簽默認在當前窗口跳轉鏈接地址

          this.$router.push相同地址報錯的解決辦法

          不能push相同的地址,否則會出 Uncaught (in promise) NavigationDuplicated vue-router.esm.js?fe87:2089 的報錯。 解決辦法:在main.js下添加以下代碼

          react監聽URL的正確方式

          addEventListener之后一定要remove,否則跳轉路由后,原有的事件又沒消除,會導致注冊了越來越多的事件;另外,removeEventListener的第二個參數指向的函數

          Node中url模塊的使用

          url.parse(url_str[,boolean])用于將url字符串轉為對象格式。該方法有兩個參數,第一個參數為url字符串,第二個為布爾值,可以不寫,表示是否也將query轉為對象

          js中window.URL對象的使用方式

          URL.createObjectURL(object)是URL對象的靜態方法,其實就是返回了一個在內存中指向傳入參數object的引用路徑url字符串。生成的這個url字符串會在當前頁面的document被銷毀的時候失效。

          URL中%2F,%2B等特殊字符

          有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那么就要使用他們的編碼了。 編碼的格式為:%加字符的ASCII碼,即一個百分號%,后面跟對應字符的ASCII(16進制)碼值。

          Js獲取URL的協議?

          想要獲取當前URL的協議,可以使用JavaScript的location.protocol屬性。 網絡協議定義了網絡設備之間通信的規則和約定。通過采用這些規則,兩個設備可以相互通信并且可以交換信息。http:超文本傳輸協議(HTTP)是分布式系統的應用協議。

          js中的window.location.search的用法與作用。

          用該屬性獲取頁面 URL 地址:window.location 對象所包含的屬性,JS 腳本捕獲頁面 GET 方式請求的參數?其實直接使用 window.location.search 獲得,然后通過 split 方法結合循環遍歷自由組織數據格式。

          聊一聊 JavaScript 的 URL 對象是什么?

          如果我們自己編寫從URL中分析和提取元素的代碼,那么有可能會比較痛苦和麻煩。程序員作為這個社會中最“懶”的群體之一,無休止的重復造輪子必然是令人難以容忍的,所以大多數瀏覽器的標準庫中都已經內置了URL對象。

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网