网页短链接的实现原理
網(wǎng)頁(yè)短鏈接是指將原本較長(zhǎng)的網(wǎng)址轉(zhuǎn)化成較短的網(wǎng)址,從而便于用戶(hù)的記憶與社交軟件上的傳播。很多互聯(lián)網(wǎng)公司都提供了生成短鏈接的服務(wù),比如新浪微博短網(wǎng)址服務(wù)等,本文就來(lái)聊聊實(shí)現(xiàn)短鏈接服務(wù)的基本原理。
我們不妨先來(lái)看一下短鏈接服務(wù)的整個(gè)流程,以前面提到的微博短網(wǎng)址服務(wù)為例。用戶(hù)輸入想要縮短的長(zhǎng)網(wǎng)址,轉(zhuǎn)化后得到一個(gè)以http://t.cn開(kāi)頭的短網(wǎng)址,然后用戶(hù)將該鏈接通過(guò)微信或者微博等方式分享給朋友,其他人點(diǎn)擊之后即可進(jìn)入原本長(zhǎng)網(wǎng)址所對(duì)應(yīng)的頁(yè)面。整個(gè)流程如下圖所示:
從圖中可以很清楚地看到,實(shí)現(xiàn)短鏈接服務(wù)的關(guān)鍵是兩個(gè)步驟:1、如何把一個(gè)任意長(zhǎng)的字符串轉(zhuǎn)化成一個(gè)較短的字符串;2、從短網(wǎng)址如何還原出長(zhǎng)網(wǎng)址。第一個(gè)問(wèn)題很容易讓人想到哈希算法,通過(guò)一定的方式將任意長(zhǎng)的文本轉(zhuǎn)化成一個(gè)固定長(zhǎng)度的字符串,只要目標(biāo)字符串的長(zhǎng)度適當(dāng),那么不同的輸入幾乎不可能對(duì)應(yīng)同一個(gè)字符串。不過(guò)這么做有個(gè)缺點(diǎn)就是無(wú)法從得到的結(jié)果還原輸入的字符串,因此不適用于我們的場(chǎng)景。但基于哈希算法的思想,我們可以設(shè)計(jì)一種以多進(jìn)制為基礎(chǔ)的算法完成這個(gè)任務(wù)。
具體而言,我們可以創(chuàng)建一個(gè)用于保存長(zhǎng)網(wǎng)址的數(shù)據(jù)表,比如就叫Url,這張表很簡(jiǎn)單,只需要兩個(gè)字段,一個(gè)主鍵用于保存id,一個(gè)url字段用于存放原始的長(zhǎng)網(wǎng)址,每個(gè)長(zhǎng)網(wǎng)址都在這張表有一條記錄。當(dāng)進(jìn)行長(zhǎng)網(wǎng)址轉(zhuǎn)換時(shí),先檢查數(shù)據(jù)表中是否存在該長(zhǎng)網(wǎng)址,若是直接獲取該記錄的id,否則在數(shù)據(jù)表中創(chuàng)建一條新記錄,并返回其id。對(duì)于這個(gè)id,我們可以得到一個(gè)多進(jìn)制表示下的新值,比如在以“0-9a-z”這36個(gè)字符表示的36進(jìn)制中,一億這個(gè)數(shù)字可以被表示成1njchs,只需要6個(gè)字符即可,將這6個(gè)字符拼接到準(zhǔn)備好的域名后即可得到一個(gè)對(duì)應(yīng)的短網(wǎng)址返回給用戶(hù)。由于一億個(gè)網(wǎng)址只需要6個(gè)字符,因此這種方式足夠滿(mǎn)足大部分網(wǎng)站的需求。
而當(dāng)用戶(hù)點(diǎn)擊了我們生成的短網(wǎng)址后,只需要將代表多進(jìn)制的這部分提取出來(lái),還原成十進(jìn)制的數(shù)字后查表即可得到原始的長(zhǎng)網(wǎng)址,再根據(jù)網(wǎng)址做一個(gè)重定向即可讓用戶(hù)訪問(wèn)到原始的網(wǎng)頁(yè)。具體的實(shí)現(xiàn)可以參考下面的typescript代碼
// 將原始的長(zhǎng)鏈接通過(guò)36進(jìn)制轉(zhuǎn)化為短鏈接 export async function long2short(url: string) {if (!url.startsWith('http://') && !url.startsWith('https://')) {throw new Error('Invalid url');}if (url.startsWith(config.shortLinkBaseUrl)) {return url;}let item = await Url.getByUrl(url);if (!item) {item = await Url.create(url);}return config.shortLinkBaseUrl + item.id.toString(36); }// 將短鏈接還原為真實(shí)的長(zhǎng)鏈接 export async function short2long(url: string) {let item = await Url.select(Number.parseInt(url, 36));if (!item) {throw new Error('Invalid url');}return item.url; }這里的config.shortLinkBaseUrl也就是我們用來(lái)做短鏈接服務(wù)的域名,在前面的例子中就是http://t.cn,我們需要在這個(gè)域名對(duì)應(yīng)的服務(wù)器內(nèi)實(shí)現(xiàn)短鏈接的服務(wù),同時(shí)這個(gè)域名本身不能太長(zhǎng),否則就失去了它的意義。另外還有一點(diǎn)值得注意,就是在根據(jù)長(zhǎng)網(wǎng)址去數(shù)據(jù)表查找它是否存在時(shí),因?yàn)殚L(zhǎng)網(wǎng)址可以任意長(zhǎng),因此直接用它作為索引在數(shù)據(jù)表中查找的話(huà)效率較低,可以考慮在表中增加一個(gè)hash字段,保存長(zhǎng)網(wǎng)址的哈希值,并通過(guò)查找哈希值來(lái)判斷條目是否存在,提高查找的效率。
以上就是短鏈接服務(wù)的基本實(shí)現(xiàn)方法,最核心的其實(shí)就是多進(jìn)制的使用,有興趣的朋友可以自己動(dòng)手試試看,有任何問(wèn)題歡迎留言交流。
總結(jié)
以上是生活随笔為你收集整理的网页短链接的实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Runtime library, CRT
- 下一篇: Jquery实现点击事件的四种写法