日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

网页短链接的实现原理

發(fā)布時(shí)間:2023/12/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网页短链接的实现原理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

網(wǎng)頁(yè)短鏈接是指將原本較長(zhǎng)的網(wǎng)址轉(zhuǎn)化成較短的網(wǎng)址,從而便于用戶的記憶與社交軟件上的傳播。很多互聯(lián)網(wǎng)公司都提供了生成短鏈接的服務(wù),比如新浪微博短網(wǎng)址服務(wù)等,本文就來(lái)聊聊實(shí)現(xiàn)短鏈接服務(wù)的基本原理。

我們不妨先來(lái)看一下短鏈接服務(wù)的整個(gè)流程,以前面提到的微博短網(wǎng)址服務(wù)為例。用戶輸入想要縮短的長(zhǎng)網(wǎng)址,轉(zhuǎn)化后得到一個(gè)以http://t.cn開(kāi)頭的短網(wǎng)址,然后用戶將該鏈接通過(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)址返回給用戶。由于一億個(gè)網(wǎng)址只需要6個(gè)字符,因此這種方式足夠滿足大部分網(wǎng)站的需求。

而當(dāng)用戶點(diǎn)擊了我們生成的短網(wǎng)址后,只需要將代表多進(jìn)制的這部分提取出來(lái),還原成十進(jìn)制的數(shù)字后查表即可得到原始的長(zhǎng)網(wǎng)址,再根據(jù)網(wǎng)址做一個(gè)重定向即可讓用戶訪問(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ù)表中查找的話效率較低,可以考慮在表中增加一個(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。