短網(wǎng)址的原理與生成方法(Java實(shí)現(xiàn))
短網(wǎng)址應(yīng)用已經(jīng)在全國(guó)各大微博上開始流行了起來。例如QQ微博的url.cn,新郎的sinaurl.cn等。
我們?cè)赒Q微博上發(fā)布網(wǎng)址的時(shí)候,微博會(huì)自動(dòng)判別網(wǎng)址,并將其轉(zhuǎn)換,例如:http://url.cn/2hytQx
為什么要這樣做的,原因我想有這樣幾點(diǎn):
- 微博限制字?jǐn)?shù)為140字一條,那么如果我們需要發(fā)一些連接上去,但是這個(gè)連接非常的長(zhǎng),以至于將近要占用我們內(nèi)容的一半篇幅,這肯定是不能被允許的,所以短網(wǎng)址應(yīng)運(yùn)而生了。
- 短網(wǎng)址可以在我們項(xiàng)目里可以很好的對(duì)開放級(jí)URL進(jìn)行管理。有一部分網(wǎng)址可以會(huì)涵蓋色情,暴力,廣告等信息,這樣我們可以通過用戶的舉報(bào),完全管理這個(gè)連接將不出現(xiàn)在我們的應(yīng)用中,應(yīng)為同樣的URL通過加密算法之后,得到的地址是一樣的。
- 我們可以對(duì)一系列的網(wǎng)址進(jìn)行流量,點(diǎn)擊等統(tǒng)計(jì),挖掘出大多數(shù)用戶的關(guān)注點(diǎn),這樣有利于我們對(duì)項(xiàng)目的后續(xù)工作更好的作出決策。
其實(shí)以上三點(diǎn)純屬個(gè)人觀點(diǎn),因?yàn)樵谖医酉聛淼牟糠猪?xiàng)目中會(huì)應(yīng)用到,所以就了解了一下,下面先來看看短網(wǎng)址映射算法的理論(網(wǎng)上找到的資料):
- 將長(zhǎng)網(wǎng)址md5生成32位簽名串,分為4段,每段8個(gè)字節(jié);
- 對(duì)這四段循環(huán)處理,取8個(gè)字節(jié),將他看成16進(jìn)制串與0x3fffffff(30位1)與操作,即超過30位的忽略處理;
- 這30位分成6段,每5位的數(shù)字作為字母表的索引取得特定字符,依次進(jìn)行獲得6位字符串;
- 總的md5串可以獲得4個(gè)6位串;取里面的任意一個(gè)就可作為這個(gè)長(zhǎng)url的短url地址;
很簡(jiǎn)單的理論,我們并不一定說得到的URL是唯一的,但是我們能夠取出4組URL,這樣幾乎不會(huì)出現(xiàn)太大的重復(fù)。
下面來看看程序部分:
public static string[] ShortUrl(string url) { //可以自定義生成MD5加密字符傳前的混合KEY string key = "Leejor"; //要使用生成URL的字符 string[] chars = new string[]{ "a","b","c","d","e","f","g","h", "i","j","k","l","m","n","o","p", "q","r","s","t","u","v","w","x", "y","z","0","1","2","3","4","5", "6","7","8","9","A","B","C","D", "E","F","G","H","I","J","K","L", "M","N","O","P","Q","R","S","T", "U","V","W","X","Y","Z" }; //對(duì)傳入網(wǎng)址進(jìn)行MD5加密 string hex = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key + url, "md5"); string[] resUrl = new string[4]; for (int i = 0; i < 4; i++) { //把加密字符按照8位一組16進(jìn)制與0x3FFFFFFF進(jìn)行位與運(yùn)算 int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 8, 8), 16); string outChars = string.Empty; for (int j = 0; j < 6; j++) { //把得到的值與0x0000003D進(jìn)行位與運(yùn)算,取得字符數(shù)組chars索引 int index = 0x0000003D & hexint; //把取得的字符相加 outChars += chars[index]; //每次循環(huán)按位右移5位 hexint = hexint >> 5; } //把字符串存入對(duì)應(yīng)索引的輸出數(shù)組 resUrl[i] = outChars; } return resUrl; }
現(xiàn)在可以直接使用該方法,可以等到下面四組值:
ShortUrl(http://www.me3.cn)[0]; //得到值fAVfui ShortUrl(http://www.me3.cn)[1]; //得到值3ayQry ShortUrl(http://www.me3.cn)[2]; //得到值UZzyUr ShortUrl(http://www.me3.cn)[3]; //得到值36rQZn
在存放這個(gè)URL的數(shù)據(jù)方面,我個(gè)人推薦TTServer,有的朋友可以沒有聽說過,下面是這個(gè)數(shù)據(jù)庫(kù)的介紹:
Tokyo Cabinet 是日本人 Mikio Hirabayashi(平林幹雄)のページ 開發(fā)的一款DBM數(shù)據(jù)庫(kù)(注:大名鼎鼎的DBM數(shù)據(jù)庫(kù)qdbm就是他開發(fā)的),該數(shù)據(jù)庫(kù)讀寫非???。insert:0.4sec/1000000 recordes(2500000qps),寫入100萬數(shù)據(jù)只需要0.4秒。search:0.33sec/1000000 recordes (3000000 qps),讀取100萬數(shù)據(jù)只需要0.33秒。
可以看到對(duì)于字典類型的數(shù)據(jù)Key/Value的查詢,這個(gè)數(shù)據(jù)庫(kù)可以說是我目前見過效率非常高的,況且他如此的小巧,用來對(duì)short url/long url的配對(duì)再好不過。
該系統(tǒng)使用6個(gè)短碼字符來表示任何長(zhǎng)度的網(wǎng)址。 有效的字符代碼是ASCII 'A'到'Z'和'0'的'5',其中每個(gè)字符包含2 ^ 5(32)狀態(tài)。 6短碼字符可用于繪制32 ^ 6(1073741824)的網(wǎng)址
首先,你需要一個(gè)數(shù)據(jù)庫(kù)表來存儲(chǔ)和檢索你映射的網(wǎng)址。
CREATE TABLE mappedURL (的CREATE TABLE mappedURL( shortCode char(6) not null, lognURL text not null, PRIMARY KEY shortCodeInd (shortCode), );
其次,你需要定義一個(gè)算法將長(zhǎng)的URL映射到短的URL。 算法上面已經(jīng)介紹過了。
第三,你需要?jiǎng)?chuàng)建一個(gè)網(wǎng)頁(yè),從數(shù)據(jù)庫(kù)的短網(wǎng)址的映射找到原始的URL,并重定向之。
總結(jié)
到此這篇關(guān)于短網(wǎng)址的原理與生成方法的文章就介紹到這了,更多相關(guān)短網(wǎng)址的原理與生成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12java中char類型轉(zhuǎn)換成int類型的2種方法
這篇文章主要給大家介紹了關(guān)于java中char類型轉(zhuǎn)換成int類型的2種方法,因?yàn)閖ava是一門強(qiáng)類型語言,所以在數(shù)據(jù)運(yùn)算中會(huì)存在類型轉(zhuǎn)換,需要的朋友可以參考下2023-07-07spring?boot?validation參數(shù)校驗(yàn)與分組嵌套各種類型及使用小結(jié)
參數(shù)校驗(yàn)基本上是controller必做的事情,畢竟前端傳過來的一切都不可信,validation可以簡(jiǎn)化這一操作,這篇文章主要介紹了spring?boot?validation參數(shù)校驗(yàn)分組嵌套各種類型及使用小結(jié),需要的朋友可以參考下2023-09-09springboot實(shí)現(xiàn)配置本地訪問端口及路徑
這篇文章主要介紹了springboot實(shí)現(xiàn)配置本地訪問端口及路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析
這篇文章主要介紹了Java設(shè)計(jì)者模式簡(jiǎn)單工廠模式解析,介紹了其簡(jiǎn)介,實(shí)例以及優(yōu)缺點(diǎn)分析,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Springboot允許logger.debug輸出日志方式
這篇文章主要介紹了Springboot允許logger.debug輸出日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06