内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

開發(fā)短網(wǎng)址系統(tǒng)的原理及其實現(xiàn)

背景

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:主機(jī)域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、水磨溝網(wǎng)站維護(hù)、網(wǎng)站推廣。

提供一個短址服務(wù)

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

任務(wù)

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

要發(fā)車了 :bus:

發(fā)車前,和大家說一下

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

本文記錄了開發(fā)短網(wǎng)址系統(tǒng)的整個過程,包括初期的算法調(diào)研、模塊設(shè)計、數(shù)據(jù)庫設(shè)計、功能擴(kuò)展等。

什么是短鏈接 :link:

就是把普通網(wǎng)址,轉(zhuǎn)換成比較短的網(wǎng)址。比如: http://t.cn/RlB2PdD 這種,在微博這些限制字?jǐn)?shù)的應(yīng)用里。好處不言而喻。短、字符少、美觀、便于發(fā)布、傳播。

百度短網(wǎng)址 http://dwz.cn/

谷歌短網(wǎng)址服務(wù) https://goo.gl/ (需科學(xué)上網(wǎng))號稱是最快的 :rocket:

原理解析

當(dāng)我們在瀏覽器里輸入 http://t.cn/RlB2PdD 時

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

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

http://t.cn 服務(wù)器會通過短碼 RlB2PdD 獲取對應(yīng)的長 URL

請求通過 HTTP 301 轉(zhuǎn)到對應(yīng)的長 URL https://m.helijia.com 。

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

301 是永久重定向,302 是臨時重定向。短地址一經(jīng)生成就不會變化,所以用 301 是符合 http 語義的。同時對服務(wù)器壓力也會有一定減少。

但是如果使用了 301 ,我們就無法統(tǒng)計到短地址被點(diǎn)擊的次數(shù)了。而這個點(diǎn)擊次數(shù)是一個非常有意思的大數(shù)據(jù)分析數(shù)據(jù)源。能夠分析出的東西非常非常多。所以選擇302雖然會增加服務(wù)器壓力,但是我想是一個更好的選擇。

來自知乎 iammutex 的 答案

算法實現(xiàn)

網(wǎng)上比較流行的算法有兩種 自增序列算法、 摘要算法

算法一

自增序列算法也叫永不重復(fù)算法

設(shè)置 id 自增,一個 10進(jìn)制 id 對應(yīng)一個 62進(jìn)制的數(shù)值,1對1,也就不會出現(xiàn)重復(fù)的情況。這個利用的就是低進(jìn)制轉(zhuǎn)化為高進(jìn)制時,字符數(shù)會減少的特性。

如下圖:十進(jìn)制 10000,對應(yīng)不同進(jìn)制的字符表示。

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

哈哈,這里附上一個進(jìn)制轉(zhuǎn)換工具 http://tool.lu/hexconvert/ 上圖的數(shù)據(jù)就是用這個工具生成的。

具體的算法實現(xiàn),自行谷歌。

算法二

將長網(wǎng)址 md5 生成 32 位簽名串,分為 4 段, 每段 8 個字節(jié)

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

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

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

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

兩種算法對比

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

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

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

流程圖

自增序列算法流程圖

st=>start: 開始

e=>end: 結(jié)束

io1=>inputoutput: 輸入網(wǎng)址

io2=>inputoutput: 返回短網(wǎng)址

op1=>operation: 返回對應(yīng)的短碼

op2=>operation: 保存輸入的網(wǎng)址到數(shù)據(jù)庫

op3=>operation: 根據(jù)id計算對應(yīng)的短碼

op4=>operation: 更新短碼到數(shù)據(jù)庫

cond1=>condition: 查詢數(shù)據(jù)庫

是否存在對

應(yīng)的短碼

st->io1->cond1

cond1(no,bottom)->op2->op3->op4->op1->io2->e

cond1(yes)->op1->io2->e

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

st=>start: 開始

e=>end: 結(jié)束

io1=>inputoutput: 輸入網(wǎng)址

io2=>inputoutput: 返回短網(wǎng)址

io3=>inputoutput: 提示用戶

該短碼已存在

io4=>inputoutput: 提示用戶

不能輸入短鏈接

op1=>operation: 返回短碼

op2=>operation: 保存輸入的網(wǎng)址到數(shù)據(jù)庫

op3=>operation: 根據(jù)id計算對應(yīng)的短碼

op4=>operation: 查詢數(shù)據(jù)庫

獲得一條

自定義短碼的url

對應(yīng)的id記錄

op5=>operation: 更新短碼到數(shù)據(jù)庫

cond1=>condition: 查詢數(shù)據(jù)庫

是否存在該URL

cond2=>condition: 用戶選擇

自定義短碼

cond3=>condition: 生成的短碼

是否存在

cond4=>condition: 短碼是否存在

cond5=>condition: 短碼是否存在

cond6=>condition: 自定義的短碼

是否存在

cond7=>condition: 用戶輸入的是短鏈接

st->io1->cond7

cond7(no,bottom)->cond1

cond7(yes)->io4->e

cond1(no,bottom)->cond2

cond1(yes)->op1->io2->e

cond2(no,bottom)->op3->cond4

cond2(yes)->cond5

cond4(no, bottom)->op5->op1->io2->e

cond4(yes)->op4->op3->cond4

cond5(no,bottom)->op5

cond5(yes)->io3->e

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

但是自增序列算法是和 id 綁定的,如果允許自定義短碼就會占用之后的短碼,之后的 id 要生成短碼的時候就發(fā)現(xiàn)短碼已經(jīng)被用了,那么 id 自增一對一不沖突的優(yōu)勢就體現(xiàn)不出來了。

那么怎么實現(xiàn)自定義短碼吶?

我是這樣處理的:

數(shù)據(jù)庫增加一個類型 type 字段,用來標(biāo)記短碼是用戶自定義生成的,還是系統(tǒng)自動生成的。

如果有用戶自定義過短碼,把它的類型標(biāo)記自定義。每次根據(jù) id 計算短碼的時候,如果發(fā)現(xiàn)對應(yīng)的短碼被占用了,就從類型為自定義的記錄里選取一條記錄,用它的 id 去計算短碼。

這樣既可以區(qū)分哪些長連接是用戶自己定義還是系統(tǒng)自動生成的,還可以不浪費(fèi)被自定義短碼占用的 id

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

數(shù)據(jù)表設(shè)計

links 表

后期功能擴(kuò)展

統(tǒng)計:點(diǎn)擊量、訪問的 ip 地域、用戶使用的設(shè)備

管理后臺:刪除、數(shù)據(jù)量

登錄:權(quán)限管理

設(shè)置密碼:輸入密碼才可以繼續(xù)訪問

當(dāng)前文章:開發(fā)短網(wǎng)址系統(tǒng)的原理及其實現(xiàn)
文章位置:http://www.rwnh.cn/article34/cgcsse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站策劃動態(tài)網(wǎng)站、微信公眾號、做網(wǎng)站、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
嘉义市| 贵州省| 天峨县| 呼玛县| 吉木乃县| 泽州县| 神木县| 罗山县| 凌云县| 清水县| 博客| 白沙| 绥阳县| 上犹县| 孝义市| 浙江省| 黄石市| 罗源县| 和田县| 曲阳县| 西青区| 阜南县| 客服| 玛多县| 屏边| 武宁县| 新平| 龙门县| 阿坝县| 延吉市| 四会市| 彭泽县| 洱源县| 景谷| 南漳县| 都昌县| 溆浦县| 揭西县| 南木林县| 靖西县| 南木林县|