本文涉及網(wǎng)絡(luò)安全
技術(shù)領(lǐng)域:
:,具體涉及的是一種黑名單url的哈希表的建立及請求url的查找方法。
背景技術(shù):
::近年來,隨著科技的進步,internet以驚人的速度飛速發(fā)展。它所包含的網(wǎng)站也日益增長,url(uniformresourcelocator,統(tǒng)一資源定位符)就是一個網(wǎng)站的唯一標識。具體來說,url是對可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問方法的一種簡潔的表示,是互聯(lián)網(wǎng)上標準資源的地址?;ヂ?lián)網(wǎng)上的每個文件都有一個唯一的url,它包含的信息指出文件的位置以及瀏覽器應(yīng)該怎么處理它。一個基本url包含模式(或稱協(xié)議)域名(或ip地址)、路徑和文件名。例如一個url:http://www.ioa.cas.cn/kycg,其中http是協(xié)議部分,而www.ioa.cas.cn就是域名,kycg則是路徑。internet的飛速發(fā)展,使人們可以通過internet獲得各種各樣的信息和資源。但是互聯(lián)網(wǎng)上的信息良莠不齊,存在著大量有害的網(wǎng)站,人們在享受互聯(lián)網(wǎng)的各種信息的同時,訪問這些有害網(wǎng)站,人們的身心和財產(chǎn)安全也可能受到危害。對大量有害的url進行過濾,是目前網(wǎng)絡(luò)安全應(yīng)用系統(tǒng)中所亟需的關(guān)鍵技術(shù)。而且url過濾不僅用于過濾有害網(wǎng)站,還可以用于企業(yè)管理員工上班時間上網(wǎng)行為,限定員工上班時間可以訪問的網(wǎng)站范圍等。url過濾是一種簡單、直接的信息過濾方法。url過濾系統(tǒng)利用預(yù)先設(shè)定好的url地址列表決定允許還是禁止用戶訪問網(wǎng)絡(luò)資源。一般來說,url地址列表可以分為兩種:白名單和黑名單。白名單是允許訪問的url地址列表,而黑名單是禁止訪問的url地址列表。url查找是url過濾系統(tǒng)的一個核心操作。眾所周知,internet上網(wǎng)站數(shù)以億計,其中絕大部分網(wǎng)站是無害的,我們不可能列舉出所有無害的網(wǎng)站和它們的urls。與無害的網(wǎng)站相比,有害的網(wǎng)站數(shù)量極少,因此通常情況下url過濾系統(tǒng)采用的是url黑名單。上面已經(jīng)介紹,一個基本url包含模式(或稱協(xié)議)、域名(或ip地址)、路徑和文件名,對于采用黑名單的url過濾系統(tǒng)來說,需要支持前綴匹配。這意味著當把一個惡意url,例如http://www.ioa.cas.cn/加入黑名單,雖然這個url 只包含了協(xié)議和域名部分,但把這個url加入到黑名單,那么這個url域名www.ioa.cas.cn下所有路徑下的url也都是禁止訪問的,例如雖然沒有把http://www.ioa.cas.cn/kycg/加入到黑名單,但是因為http://www.ioa.cas.cn/kycg在域名www.ioa.cas.cn下,因此也是要禁止訪問的?,F(xiàn)有的url查找技術(shù)主要是基于哈希的方法。這類方法的原理是將url通過哈希函數(shù)映射到特定的數(shù)據(jù)結(jié)構(gòu)來加速查找,常用的數(shù)據(jù)結(jié)構(gòu)有哈希表、布隆濾波器等。這類基于哈希的方法雖然處理效率很高,但是它們沒有考慮url的語法格式,而是將url當成一個整體,將每個url從第一個字符到最后一個字符哈希,因此不支持前綴匹配。為了支持url的前綴匹配,研究者們提出了建立url分解樹的方法。這類方法的基本原理是:根據(jù)url的語法格式,將每個url分解為子項,然后建立一棵url分解樹。url查找過程是一個樹的遍歷過程,每次匹配樹的一個子節(jié)點,直到匹配到葉節(jié)點。這種方法雖然能解決前綴匹配的問題,但是由于它們使用了樹的結(jié)構(gòu),所以url的查找效率受到了制約。技術(shù)實現(xiàn)要素:本發(fā)明的目的在于克服目前利用url查找方法中存在的上述問題,提出了一種黑名單url的哈希表的建立及請求url的查找方法,該方法既具備哈希算法的高效性能,同時又能支持前綴匹配。為了實現(xiàn)上述目的,本發(fā)明提供了一種黑名單url的哈希表的建立方法,該方法具體包括以下步驟:步驟s1)遍歷黑名單中的url字符串,按照分隔符的個數(shù)將黑名單中的url分為三類;計算三類url所占的比例,計算出分配給三類url的哈希表的“桶”數(shù);步驟s2)通過哈希函數(shù)處理得到每個url的哈希值h,計算其對應(yīng)的“桶”的索引值;然后將每個url插入到哈希表的“桶”上,當所有的url插入到哈希表的“桶”上時,黑名單url的哈希表建立完畢。上述技術(shù)方案中,所述步驟s1)具體包括:步驟s1-1)將黑名單中的url分為三類:第一類是url字符串只包含一個分隔符‘/’,第二類是url字符串包含兩個分隔符‘/’,第三類是包含三個及三個以上分隔符‘/’;步驟s1-2)通過遍歷黑名單中的url字符串,得到三類url占總url的比例;步驟s1-3)計算哈希表分配給三類url的“桶”的數(shù)目;分配給第一類url“桶”的數(shù)目為:num1=hashtablesize*ratio_1,其中,ratio_1為第一類url所占的比例;分配給第二類url“桶”的數(shù)目為:num2=hashtablesize*ratio_2,其中,ratio_2為第二類url所占的比例;分配給第三類url“桶”的數(shù)目為:num3=hashtablesize*ratio_3,其中ratio_3為第三類url所占的比例。上述技術(shù)方案中,所述步驟s2)具體包括:步驟s2-1)通過哈希函數(shù)處理,得到黑名單中每個url的哈希值h;步驟s2-2)根據(jù)步驟s1-2)所得到的分配給各類url的“桶”的數(shù)目和每個url的哈希值h,計算其對應(yīng)的“桶”的索引值;根據(jù)第一類url字符串的哈希值h計算其索引值:hash_index=h%num1,將第一類url字符串的哈希值限定1~num1范圍內(nèi);根據(jù)第二類url字符串的哈希值h計算其索引值:hash_index=h%num2+num1,將第一類url字符串的哈希值限定num1~num1+num2范圍內(nèi);根據(jù)第三類url字符串的哈希值h計算其索引值:hash_index=h%num3+num1+num2;將第三類url字符串的哈希值限定在num1+num2~num1+num2+num3范圍內(nèi);步驟s2-3)根據(jù)每個url的“桶”的索引值,將每個url插入到哈希表的“桶”上,當所有的url插入到哈希表的“桶”上時,黑名單url的哈希表建立完畢。上述技術(shù)方案中,所述步驟s2-3)中的將每個url插入到哈希表的“桶”上的實現(xiàn)過程為:首先查看url的索引值對應(yīng)的“桶”是否為空;如果“桶”為空,計算該url的前綴哈希值,申請一個節(jié)點prefix_node,這個節(jié)點的前綴值為這個url的前綴哈希值,同時這個節(jié)點也指向一個鏈表url_list,將這個url字符串加入到鏈表url_list中;如果“桶”不為空,那么首先要遍歷這個“桶”所指向的鏈表prefix_list中的prefix_node節(jié)點,檢查節(jié)點的前綴值是否和這個url的前綴哈希值相等,如果有一個節(jié)點的前綴值和這個url的前綴哈希值相等,那么將這個url添加到這個節(jié)點所指向的鏈表url_list中;如果這個鏈表上所有節(jié)點的前綴值都和這個url字符串的前綴值不相等,那么給這個鏈表增加一個prefix_node節(jié)點,這個節(jié)點的前綴值為url字符串的前綴哈希值,并且再建立一個這個節(jié)點指向的url_list鏈表,將這個url添加到url_list鏈表上?;谏鲜龅暮诿麊蝩rl的哈希表的建立方法建立的哈希表,本發(fā)明還提供了一種請求url的查詢方法,用于在哈希表中查詢請求url;所述方法包括:步驟t1)逐個處理請求url中的字符,得到包含的分隔符‘/’數(shù)目;根據(jù)分隔符的數(shù)目計算每個分隔符之前的所有字符的哈希值,計算其對應(yīng)的“桶”的索引值;步驟t2)根據(jù)請求url的分隔符的個數(shù)和索引值在所述哈希表中查詢請求url,返回查詢結(jié)果,查詢完畢。上述技術(shù)方案中,所述步驟t1)的具體實現(xiàn)過程為:當請求url只包含一個分隔符‘/’,計算這個分隔符之前的所有字符組成的字符串的哈希值h,根據(jù)哈希值h計算“桶”的索引值hash_index1;當請求url包含兩個分隔符‘/’,計算第一個分隔符之前的所有字符的哈希值h1,其對應(yīng)的“桶”的索引值為hash_index1;得到第二個分隔符之前的所有字符串得到的哈希值h2,其對應(yīng)的“桶”的索引值為hash_index2;當請求url包含三個以及以上各分隔符,計算由第一個分隔符之前的所有字符組成的字符串的哈希值h1,其對應(yīng)的“桶”的索引值為hash_index1;計算第二個分隔符之前的所有字符串的哈希值h2,其對應(yīng)的“桶”的索引值為hash_index2;計算第三個分隔符之前的所有字符串的哈希值h3,其對應(yīng)的“桶”的索引值為hash_index3;如果請求url包含3個以上分隔符,第三個分隔符后面的字符不再繼續(xù)處理。上述技術(shù)方案中,所述步驟t2)具體包括:步驟t2-1)判斷分隔符的個數(shù)是否等于1,如果判斷結(jié)果是肯定的,轉(zhuǎn)入步驟t2-2);否則,轉(zhuǎn)入步驟t2-5);步驟t2-2)根據(jù)其索引值hash_index1查找哈希表的第hash_index1個“桶”;如果這個“桶”為空,則這個請求url不在黑名單中,轉(zhuǎn)到步驟t2-14);否則,轉(zhuǎn)入步驟t2-3);步驟t2-3)遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷prefix_node節(jié)點的前綴值和請求url的前綴值是否相等,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-4);否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-4)將請求url和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配:首先判斷請求url長度是否大于等于url節(jié)點上url的長度,如果請求url的長度小于url節(jié)點上url的長度,則前綴匹配失敗,進行下一個節(jié)點上的前綴匹配;否則,比較請求url和url節(jié)點上url 是否相等;如果請求url和url節(jié)點上url相等,則匹配成功,判定請求url在黑名單中,轉(zhuǎn)入步驟t2-14);否則繼續(xù)下一個節(jié)點上的url匹配;如果這個url_list上所有url節(jié)點都和請求url不相等,則匹配失敗,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-5)判斷分隔符的個數(shù)是否等于2,如果判斷結(jié)果是肯定的,轉(zhuǎn)入步驟t2-6);否則,轉(zhuǎn)入步驟t2-9);步驟t2-6)根據(jù)請求url的2個索引值hash_index1和hash_index2;檢查哈希表的第hash_index1個“桶”,如果這個“桶”不為空,轉(zhuǎn)入步驟t2-2);如果這個“桶”為空,轉(zhuǎn)入步驟t2-7);步驟t2-7)檢查哈希表的第hash_index2個“桶”;遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷節(jié)點的前綴值和請求url的前綴值是否相同,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-8);否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-8)將請求url的第1個分隔符之前的部分和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配;如果匹配成功,則請求url在黑名單中,轉(zhuǎn)入步驟t2-14);如果匹配不成功,則請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-9)根據(jù)請求url的3個索引值hash_index1、hash_index2和hash_index3;檢查哈希表的第hash_index1個“桶”,如果這個“桶”不為空,轉(zhuǎn)入步驟t2-2);如果這個“桶”為空;檢查哈希表的第hash_index2個“桶”;如果這個“桶”不為空,轉(zhuǎn)入步驟t2-10);否則,轉(zhuǎn)入步驟t2-12);步驟t2-10)遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷節(jié)點的前綴值和請求url的前綴值是否相同,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-11);否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-11)將請求url的第2個分隔符之前的部分和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配;如果匹配成功,則請求url在黑名單中,轉(zhuǎn)入步驟t2-14);如果匹配不成功,則請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-12)檢查哈希表的第hash_index3個“桶”,如果這個“桶”為空,則這個請求url不在黑名單中,轉(zhuǎn)到步驟t2-14);如果這個“桶”不為空,遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷節(jié)點的前綴值和請求url的前綴值是否相同,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-13); 否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-13)將請求url的第3個分隔符之前的部分和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配;如果匹配成功,則請求url在黑名單中,轉(zhuǎn)入步驟t2-14);如果匹配不成功,則請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-14)獲取匹配查詢結(jié)果,查詢完畢本發(fā)明的優(yōu)點在于:本發(fā)明的方法既具備哈希算法的高效性能,同時又能支持前綴匹配,提高了查找效率。附圖說明圖1為本發(fā)明的種黑名單url的哈希表的建立方法的流程圖;圖2為本發(fā)明的哈希表的示意圖圖3為本發(fā)明的請求url查詢過程的流程圖。具體實施方式下面結(jié)合附圖和具體實施例對本發(fā)明的進一步的詳細描述。如圖1所示,一種黑名單url的哈希表的建立方法,所述方法包括:步驟s1)遍歷黑名單中的url字符串,按照分隔符的個數(shù)將黑名單中的url分為三類;計算三類url所占的比例,計算出分配給三類url的哈希表的“桶”數(shù);具體包括:步驟s1-1)將黑名單中的url分為三類:第一類是url字符串只包含一個分隔符‘/’,第二類是url字符串包含兩個分隔符‘/’,第三類是包含三個及三個以上分隔符‘/’;步驟s1-2)通過遍歷黑名單中的url字符串,得到三類url占總url的比例;步驟s1-3)計算哈希表分配給三類url的“桶”的數(shù)目;分配給第一類url“桶”的數(shù)目為:num1=hashtablesize*ratio_1,其中,ratio_1為第一類url所占的比例;分配給第二類url“桶”的數(shù)目為:num2=hashtablesize*ratio_2,其中,ratio_2為第二類url所占的比例;分配給第三類url“桶”的數(shù)目為:num3=hashtablesize*ratio_3,其中ratio_3為第三類url所占的比例。步驟s2)通過哈希函數(shù)處理得到每個url的哈希值h,計算其對應(yīng)的“桶”的 索引值;然后將每個url插入到哈希表的“桶”上,當所有的url插入到哈希表的“桶”上時,黑名單url的哈希表建立完畢。步驟s2-1)通過哈希函數(shù)處理,得到黑名單中每個url的哈希值h;步驟s2-2)根據(jù)步驟s1-2)所得到的分配給各類url的“桶”的數(shù)目和每個url的哈希值h計算其對應(yīng)的“桶”的索引值;根據(jù)第一類url字符串的哈希值h計算其索引值:hash_index=h%num1,將第一類url字符串的哈希值限定1~num1內(nèi);根據(jù)第二類url字符串的哈希值h計算其索引值:hash_index=h%num2+num1,將第一類url字符串的哈希值限定num1~num1+num2范圍內(nèi);根據(jù)第三類url字符串的哈希值h計算其索引值:hash_index=h%num3+num1+num2;將第三類url字符串的哈希值限定在num1+num2~num1+num2+num3范圍內(nèi)。步驟s2-3)根據(jù)每個url的“桶”的索引值,將每個url插入到哈希表的“桶”上,建立哈希表;首先查看url的索引值對應(yīng)的“桶”是否為空;如果“桶”為空,計算該url的前綴哈希值,申請一個節(jié)點prefix_node,這個節(jié)點的前綴值為這個url的前綴哈希值,同時這個節(jié)點也指向一個鏈表url_list,將這個url字符串加入到鏈表url_list中;如果“桶”不為空,那么首先要遍歷這個“桶”所指向的鏈表prefix_list中的prefix_node節(jié)點,檢查節(jié)點的前綴值是否和這個url的前綴哈希值相等,如果有一個節(jié)點的前綴值和這個url的前綴哈希值相等,那么將這個url添加到這個節(jié)點所指向的鏈表url_list中。如果這個鏈表上所有節(jié)點的前綴值都和這個url字符串的前綴值不相等,那么給這個鏈表增加一個prefix_node節(jié)點,這個節(jié)點的前綴值為url字符串的前綴哈希值,并且再建立一個這個節(jié)點指向的url_list鏈表,將這個url添加到url_list鏈表上;如圖2所示,當所有黑名單的url插入哈希表后,哈希表建立完畢?;谏鲜龇椒ń⒌墓1?,本發(fā)明還提供了一種請求url的查詢方法,用于在哈希表中查詢請求url;所述方法包括:步驟t1)逐個處理請求url中的字符,得到包含的分隔符‘/’數(shù)目;根據(jù)分隔符的數(shù)目計算每個分隔符之前的所有字符的哈希值,計算其對應(yīng)的“桶”的索引值;當請求url只包含一個分隔符‘/’,計算這個分隔符之前的所有字符組成的字符串的哈希值h,根據(jù)哈希值h計算“桶”的索引值hash_index1;當請求url包含兩個分隔符‘/’,計算第一個分隔符之前的所有字符的哈希值h1,其對應(yīng)的“桶”的索引值為hash_index1;得到第二個分隔符之前的所有字符串得到的哈希值h2,其對應(yīng)的“桶”的索引值為hash_index2;當請求url包含三個以及以上各分隔符,計算由第一個分隔符之前的所有字符組成的字符串的哈希值h1,其對應(yīng)的“桶”的索引值為hash_index1;計算第二個分隔符之前的所有字符串的哈希值h2,其對應(yīng)的“桶”的索引值為hash_index2;計算第三個分隔符之前的所有字符串的哈希值h3,其對應(yīng)的“桶”的索引值為hash_index3;如果請求url包含3個以上分隔符,第三個分隔符后面的字符不再繼續(xù)處理。步驟t2)根據(jù)請求url的分隔符的個數(shù)和索引值在所述哈希表中查找請求url;如圖3所示,所述步驟t2)具體包括:步驟t2-1)判斷分隔符的個數(shù)是否等于1,如果判斷結(jié)果是肯定的,轉(zhuǎn)入步驟t2-2);否則,轉(zhuǎn)入步驟t2-5);步驟t2-2)根據(jù)其索引值hash_index1查找哈希表的第hash_index1個“桶”;如果這個“桶”為空,則這個請求url不在黑名單中,轉(zhuǎn)到步驟t2-14);否則,轉(zhuǎn)入步驟t2-3);步驟t2-3)遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷prefix_node節(jié)點的前綴值和請求url的前綴值是否相等,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-4);否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-4)將請求url和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配:首先判斷請求url長度是否大于等于url節(jié)點上url的長度,如果請求url的長度小于url節(jié)點上url的長度,則前綴匹配失敗,進行下一個節(jié)點上的前綴匹配;否則,比較請求url和url節(jié)點上url是否相等;如果請求url和url節(jié)點上url相等,則匹配成功,判定請求url在黑名單中,轉(zhuǎn)入步驟t2-14);否則繼續(xù)下一個節(jié)點上的url匹配;如果這個url_list上所有url節(jié)點都和請求url不相等,則匹配失敗,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-5)判斷分隔符的個數(shù)是否等于2,如果判斷結(jié)果是肯定的,轉(zhuǎn)入步驟t2-6);否則,轉(zhuǎn)入步驟t2-9);步驟t2-6)根據(jù)請求url的2個索引值hash_index1和hash_index2;檢查哈希表的第hash_index1個“桶”,如果這個“桶”不為空,轉(zhuǎn)入步驟t2-2);如果這個“桶” 為空,轉(zhuǎn)入步驟t2-7);步驟t2-7)檢查哈希表的第hash_index2個“桶”;遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷節(jié)點的前綴值和請求url的前綴值是否相同,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-8);否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-8)將請求url的第1個分隔符之前的部分和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配;如果匹配成功,則請求url在黑名單中,轉(zhuǎn)入步驟t2-14);如果匹配不成功,則請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-9)根據(jù)請求url的3個索引值hash_index1、hash_index2和hash_index3;檢查哈希表的第hash_index1個“桶”,如果這個“桶”不為空,轉(zhuǎn)入步驟t2-2);如果這個“桶”為空;檢查哈希表的第hash_index2個“桶”;如果這個“桶”不為空,轉(zhuǎn)入步驟t2-10);否則,轉(zhuǎn)入步驟t2-12);步驟t2-10)遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷節(jié)點的前綴值和請求url的前綴值是否相同,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-11);否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-11)將請求url的第2個分隔符之前的部分和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配;如果匹配成功,則請求url在黑名單中,轉(zhuǎn)入步驟t2-14);如果匹配不成功,則請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-12)檢查哈希表的第hash_index3個“桶”,如果這個“桶”為空,則這個請求url不在黑名單中,轉(zhuǎn)到步驟t2-14);如果這個“桶”不為空,遍歷這個桶所指鏈表prefix_list的節(jié)點prefix_node,判斷節(jié)點的前綴值和請求url的前綴值是否相同,如果存在一個節(jié)點的前綴值和請求url的前綴值相等,轉(zhuǎn)入步驟t2-13);否則,請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-13)將請求url的第3個分隔符之前的部分和這個prefix_node節(jié)點所指向的前綴值相同的鏈表上url_list上的url節(jié)點開始逐個進行匹配;如果匹配成功,則請求url在黑名單中,轉(zhuǎn)入步驟t2-14);如果匹配不成功,則請求url不在黑名單中,轉(zhuǎn)入步驟t2-14);步驟t2-14)獲取匹配結(jié)果,查詢完畢。在建立哈希表和查找請求url用哈希函數(shù)做哈希處理的過程中,只處理前3個分隔符之前的數(shù)據(jù),這是因為一般加入到黑名單中的url都很短,很少會包含3個 以上的分隔符。而實際請求url一般卻很長,處理整個請求url會增大查找時間。因為黑名單中的url很短,不用處理完整個url就可以判斷請求url是否在黑名單中或者是黑命單中url的子部分。只處理請求url字符串的部分,既可以達到查找的目的,又減小了處理時間。下面以實例對上述方法進行說明。假設(shè)黑名單中url為100萬條,哈希表的表項有80萬,3類url的比例為1/2、1/4、1/4,那么分配給三類url“桶”的個數(shù)分別為40萬個、20萬、20萬。那么第一類url將被插入到哈希表的第0~40萬個“桶”上,第二類url將被插入到哈希表的第40~60萬個的“桶”上,第三類url將被插入到哈希表的第60~80萬個的“桶”上。以黑名單中的urlhttp://image.baidu.com/channel和https://www.taobao.com為例:(1)據(jù)分隔符“://”將原始url分為兩項,http和image.baidu.com/channel,忽略分隔符“://”前面的部分,即協(xié)議部分;只處理image.baidu.com/channel這一部分。(2)檢查剩下部分image.baidu.com/channel這一部分包含分隔符“/”的個數(shù)??梢灾腊指舴?”的個數(shù)為2,沒有超過3個,對除去協(xié)議部分的余下的url整個做哈希處理,得到哈希值h;因為要將這個url插入到哈希表的第40萬~60萬的某個“桶”上,根據(jù)哈希值計算索引值:hash_index=h%num2+num1,得到最終的索引值hash_index=467147這里使用的哈希函數(shù)是文獻《兩種對url的散列效果很好的函數(shù)》中介紹的哈希函數(shù)_hf,定義如下:int_hf(char*url,intsize){intresult=0;char*ptr=url;intc;for(inti=1;c=*ptr++;i++)result+=c*3*i;if(result<0)result=-result;returnresult%size;}檢查哈希表,hashtable[hash_index]處的“桶”是否為空。此時hashtable[hash_index]處為空,將此url(image.baidu.com/channel/star)插入到這個“桶”指向鏈表的第一個節(jié)點上,并記錄這個節(jié)點的前綴值prefix=30583。計算前綴值是取url字符串的前兩個字節(jié),計算公式如下:unsignedshortprefix_hash(unsignedchar*url){return(unsignedshort)((*url)<<8|*(url+1));}這里為了處理哈希沖突,即有多個url被哈希到同一表項,則采用鏈式存儲結(jié)構(gòu)。https://www.taobao.com插入到哈希表的第73229個“桶”上,前綴值prefix=30583。例1:請求url為:https://www.taobao.com/market/nvzhuang將請求url去除協(xié)議https部分,只對余下部分www.taobao.com/market/nvzhuang處理。這部分包含3個分隔符,使用建立哈希表過程中使用的哈希函數(shù)。首先得到www.taobao.com部分的哈希值h1,www.taobao.com/market部分的哈希值h2,www.taibao.com/market/nvzhuang部分的哈希值h3,計算索引值:hash_index1=h1%num=73229hash_index2=h%num2+num1=408664hash_index3=h%num2+num1+num2,hash_index3=605580。首先檢查哈希表的第hash_index1個“桶”。這個桶上有一個節(jié)點,這個節(jié)點的前綴值prefix=30583,和請求url:www.taobao.com/market/nvzhuang的前綴值相同,則將請求url第一個分隔符“/”之前的部分www.taobao.com和這個節(jié)點所指向的鏈表上的url節(jié)點www.taobao.com開始匹配,前綴匹配成功。請求url在黑名單中;不再繼續(xù)檢查哈希表的第hash_index1和第hash_index2個“桶”。例2:請求http://image.baidu.com/channel計算兩個索引值hash_index1=76550,hash_index2=467147。首先檢查哈希表的第hash_index1“桶”;這個桶上有一個節(jié)點,這個節(jié)點的前綴值prefix=30583,和請求url(image.baidu.com/channel)的前綴值不同,在這個“桶”上沒有產(chǎn)生匹配,再檢查哈希表的第hash_index2個“桶”;哈希表的第hash_index2個“桶”上有一個節(jié)點,這個節(jié)點的前綴值prefix=26989,和請求url(image.baidu.com/channel)的前綴值相同,則將請求url個這個節(jié)點所指向的鏈表上的url節(jié)點image.baidu.com/channel開始匹配,前綴匹配成功。請求url在黑名單中。例3:請求http://weibo.com計算索引值hash_index1=30563,檢查哈希表的第hash_index1個“桶”;這個“桶”為空,請求url不在黑名單中。在上述查找過程中,會根據(jù)請求url包含的分隔符“/”的數(shù)目得到不同數(shù)量的哈希值。得到哈希值之后,計算得到索引值,然后查找索引值處的哈希表的“桶”。以得到2個索引值hash_index1,hash_index2為例。首先會查找hash_index1處的“桶”,hash_index1處的“桶”上的黑名單中的url只包含一個分隔符,代表的往往是此處的url只包含域名。先將請求url和只包含域名的黑名單中url進行前綴比較,即檢查請求url是否和黑名單中url相等或者是黑名單中url域名下的某一路徑或者子路徑等。例1中查找請求https://www.taobao.com/market/nvzhuang中檢查哈希表hash_index1=76550處的“桶”,將請求url:https://www.taobao.com/market/nvzhuang和hash_index1=73229處節(jié)點上的url:https://www.taobao.com前綴比較就是這個過程。當前第1頁12當前第1頁12