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