本發(fā)明涉及ip地址段索引領(lǐng)域。具體涉及基于前綴森林的ip索引方法。
背景技術(shù):
術(shù)語定義:
ip:internetprotocol.因特網(wǎng)協(xié)議是為計算機(jī)網(wǎng)絡(luò)相互連接進(jìn)行通信而設(shè)計的協(xié)議。
ipaddress:internetprotocoladdress.因特網(wǎng)協(xié)議地址是因特網(wǎng)協(xié)議中為因特網(wǎng)上的每臺計算機(jī)和其它設(shè)備都規(guī)定的一個唯一的地址。
cidrnotation:classlessinter-domainroutingnotation.無類別域間路由表示法是一種表示ip地址段的方法,由ip地址前綴和掩碼兩部分組成。掩碼內(nèi)部分等于ip地址前綴的ip地址都屬于這一段ip地址段。
trie:又稱前綴樹或字典樹,是一種有序樹。一個節(jié)點的所有子孫都有相同的前綴,也就是這個節(jié)點對應(yīng)的字符串。
二叉樹:每個節(jié)點最多有兩個子樹的樹結(jié)構(gòu)。
葉節(jié)點:一棵樹當(dāng)中沒有子結(jié)點的結(jié)點。
索引:是一個單獨的、物理的數(shù)據(jù)庫結(jié)構(gòu),它是某個表中一列或若干列值的集合和相應(yīng)的指向表中物理標(biāo)識這些值的數(shù)據(jù)頁的邏輯指針清單。
時間復(fù)雜度:定量描述算法運行時間的函數(shù)。
現(xiàn)在越來越多的網(wǎng)絡(luò)服務(wù)會根據(jù)訪客的ip地址查詢出對應(yīng)的信息(如地理位置)后使用相匹配的語言、時區(qū)等配置以及提供個性化的服務(wù),甚至根據(jù)ip地址賦予差異化的用戶權(quán)限,從而提升用戶體驗和保障安全性,通常,ip地址與其索引的信息呈現(xiàn)“多對一”的映射關(guān)系,并且有相同信息的ip地址成段出現(xiàn),因此ip地址的索引問題等價于ip地址的段的索引問題。
現(xiàn)有技術(shù)通常以每個ip地址段的起始地址來唯一標(biāo)識一段ip地址。查詢時按順序遍歷起始地址(這里默認(rèn)順序是從小到大),當(dāng)某一起始地址大于要查詢的地址時,獲取上一個起始地址所索引的數(shù)據(jù)塊并返回。
例如:用4.30.42.207代表4.30.42.207~4.30.42.255這個ip地址段,用4.30.43.0代表下一個ip地址段。當(dāng)查詢ip地址4.30.42.233時,遍歷到4.30.43.0時首次發(fā)現(xiàn)4.30.43.0大于4.30.42.233,因此認(rèn)為4.30.42.233位于前一個也就是4.30.42.207~4.30.42.255這個ip地址段。于是返回4.30.42.207所指向的數(shù)據(jù)塊。
通常會在這種線性遍歷之前,加入8位或16位的二級索引,以提高性能。仍然以查詢4.30.42.233為例:其前16位是4.30(十進(jìn)制為1054),于是在二級索引中查詢第1054個數(shù)據(jù)塊,這個數(shù)據(jù)塊存儲了4.30.0.0這個ip地址段的位置,于是直接跳轉(zhuǎn)到4.30.0.0處開始上述的線性遍歷。
現(xiàn)有技術(shù)的線性遍歷方式邏輯簡單,易于實現(xiàn),適合小規(guī)模的應(yīng)用,但隨著ip數(shù)據(jù)庫的豐富,ip地址分段必然越來越多,線性遍歷的時間復(fù)雜度也會隨之等比例上升,無法保證將查詢控制在一個常數(shù)時間內(nèi)。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是針對上述背景技術(shù)中的缺陷,提供一種基于前綴森林的ip索引方法,實現(xiàn)降低ip索引的復(fù)雜度,壓縮索引數(shù)據(jù)的大小,節(jié)省大量的存儲空間的效果。
為了達(dá)到上述的技術(shù)效果,本發(fā)明采取以下技術(shù)方案:
基于前綴森林的ip索引方法,包括如下步驟:
步驟一:創(chuàng)建索引;
將ip地址段用cidr表示法表示,按前16位分別添加到65536棵二叉trie樹中的某一棵,對后面在掩碼范圍內(nèi)的每一位添加一個0或1的子節(jié)點,最后添加的一個子節(jié)點成為葉子節(jié)點,存儲著到達(dá)這一葉子節(jié)點的最短路徑所代表的ip地址段所索引的數(shù)據(jù)塊的位置;
步驟二:查詢ip地址。
由前16位的值直接定位到一棵二叉trie樹,根據(jù)ip地址后面的每一位沿二叉trie樹走到葉子節(jié)點,取到葉子節(jié)點中索引的位置,按此位置查詢到目標(biāo)數(shù)據(jù)。
本發(fā)明與現(xiàn)有技術(shù)相比,具有以下的有益效果:本發(fā)明將前綴森林應(yīng)用到ip索引中,在創(chuàng)建索引時,將ip地址段用cidr表示法表示,同時引入二叉樹和節(jié)點概念,在查詢ip地址時,同樣根據(jù)這些二叉樹和節(jié)點查詢目標(biāo)數(shù)據(jù)。與傳統(tǒng)線性遍歷方式相比較,該前綴森林索引方式大大降低了ip索引的復(fù)雜度,每次查詢的時間復(fù)雜度由o(n)降低到了o(1),同時該方式不用表示出完整的ip地址,壓縮了索引數(shù)據(jù)的大小。
附圖說明
圖1是本發(fā)明的邏輯示意圖;
圖2是本發(fā)明的效果示意圖。
具體實施方式
下面結(jié)合本發(fā)明的實施例對本發(fā)明作進(jìn)一步的闡述和說明。
實施例:
圖1是本發(fā)明的邏輯示意圖,如圖所示本發(fā)明主要分為創(chuàng)建索引和查詢ip:
創(chuàng)建索引時,將ip地址段用cidr表示法表示,按前16位分別添加到65536棵二叉trie樹中的某一棵,對后面在掩碼范圍內(nèi)的每一位添加一個0或1的子節(jié)點,最后添加的一個子節(jié)點成為葉子節(jié)點,存儲著到達(dá)這一葉子節(jié)點的最短路徑所代表的ip地址段所索引的數(shù)據(jù)塊的位置。
查詢ip地址時,由前16位的值直接定位到一棵二叉trie樹,根據(jù)ip地址后面的每一位沿二叉trie樹走到葉子節(jié)點,取到葉子節(jié)點中索引的位置,按此位置查詢到目標(biāo)數(shù)據(jù),圖中粗箭頭指出了在這個數(shù)據(jù)庫中4.30.255.13這個ip地址的查詢過程。
下面以4.30.255.13這個ip地址為例具體說明:
創(chuàng)建索引:將ip地址段用cidr表示法表示,按前16位分別添加到65536棵二叉trie樹中的某一棵,對后面在掩碼范圍內(nèi)的每一位添加一個0或1的子節(jié)點,最后添加的一個子節(jié)點成為葉子節(jié)點,存儲著到達(dá)這一葉子節(jié)點的最短路徑所代表的ip地址段所索引的數(shù)據(jù)塊的位置。
查找過程:由前16位4.30先定位到某個二叉trie樹,再根據(jù)后16位255.13地址后面的每一位沿二叉trie樹走到葉子節(jié)點,取到葉子節(jié)點中索引的位置,按此位置查詢到目標(biāo)數(shù)據(jù)。
圖2是本發(fā)明的效果示意圖,該圖表示了16.8萬條地理信息的數(shù)據(jù)庫中線性遍歷和前綴森林性能的對比,由圖可見,本發(fā)明技術(shù)方案帶來的效果顯而易見,以前綴森林索引ip地址段,每次查詢的時間復(fù)雜度由o(n)降低到了o(1),壓縮了索引數(shù)據(jù)的大小。
trie樹又叫前綴樹,trie樹有兩種實現(xiàn),一種是是二十六叉樹方式實現(xiàn);另一種是二叉樹方式實現(xiàn),就是將一個節(jié)點的第一個兒子放在左兒子的位置,下一個兒子,即左兒子的第一個兄弟,放在左兒子的右兒子位置上,再下一個兄弟接著放在右兒子的右兒子的位置。本發(fā)明將前綴森林應(yīng)用到ip索引中,在創(chuàng)建索引時,將ip地址段用cidr表示法表示,同時引入二叉樹和節(jié)點概念,在查詢ip地址時,同樣根據(jù)這些二叉樹和節(jié)點查詢目標(biāo)數(shù)據(jù)。從ip地址段的cidr表示法中暗含的前綴表達(dá)思想中,我們可以看到二叉trie樹在ip地址段索引中應(yīng)用的可能:ip地址的位數(shù)固定為32,因此查詢一個ip地址所需要的讀取次數(shù)被限制在32次以內(nèi),時間復(fù)雜度為常數(shù),與數(shù)據(jù)庫的增長無關(guān);二叉trie樹的每一層都是ip地址的某一位,用一個位的空間即可表達(dá),不用存下完整的32位ip地址,這會節(jié)省大量的存儲空間。另外,經(jīng)過統(tǒng)計,一份16萬段的ip地理數(shù)據(jù)庫中,多達(dá)94%的ip地址段在用cidr表示法表示時其掩碼的位數(shù)大于16。在類似場景里,可以使用與現(xiàn)有技術(shù)相同的16位二級索引,索引到一個由65536棵二叉trie樹構(gòu)造的前綴森林中。綜上所述,與傳統(tǒng)線性遍歷方式相比較,該前綴森林索引方式大大降低了ip索引的復(fù)雜度,每次查詢的時間復(fù)雜度由o(n)降低到了o(1),同時該方式不用表示出完整的ip地址,壓縮了索引數(shù)據(jù)的大小。
可以理解的是,以上實施方式僅僅是為了說明本發(fā)明的原理而采用的示例性實施方式,然而本發(fā)明并不局限于此。對于本領(lǐng)域內(nèi)的普通技術(shù)人員而言,在不脫離本發(fā)明的精神和實質(zhì)的情況下,可以做出各種變型和改進(jìn),這些變型和改進(jìn)也視為本發(fā)明的保護(hù)范圍。