創(chuàng)建哈希表的方法和設(shè)備的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及通信領(lǐng)域,具體涉及一種創(chuàng)建哈希表的方法和設(shè)備。
【背景技術(shù)】
[0002]哈希(hash)表具有較高的查找性能,在通信技術(shù)領(lǐng)域應(yīng)用十分廣泛。2-left哈希算法將一個哈希函數(shù)分成兩個獨(dú)立的哈希函數(shù)hashl和hash2,兩個哈希函數(shù)分別對應(yīng)等大的哈希子表,兩個哈希子表對應(yīng)的哈希函數(shù)hashl和hash2的最大輸出通常是2的正整數(shù)次冪,生成的哈希子表空間也是等大的2的正整數(shù)次冪,比如2兆(2097152)、4兆(4194304)、8 兆(8388608)、16 兆(16777216)、32 兆(33554432)等等,因此 2-left 哈希表空間為兩個哈希子表空間之和,也為2的正整數(shù)次冪。而實(shí)際的需求的表項(xiàng)個數(shù)通常不是2的正整數(shù)次冪,比如5 000 000,20 000 000,24 000 000等等。
[0003]為了滿足非2的正整數(shù)次冪的哈希表項(xiàng)需求,最常用的方法是尋找和它最接近的2的正整數(shù)次冪空間來完成,即使用大的空間來滿足現(xiàn)有表項(xiàng)需求。比如24 000 000表項(xiàng)的哈希表,通常采用32兆的表項(xiàng)的哈希表來實(shí)現(xiàn)。
[0004]使用大的哈希表來實(shí)現(xiàn)非2的正整數(shù)次冪的空間,以32兆表項(xiàng)來實(shí)現(xiàn)24 000 000的空間為例,大約8 000 000的空間被浪費(fèi)掉,即大約25%的表項(xiàng)空間是冗余的,造成空間的浪費(fèi),增加了實(shí)現(xiàn)的代價。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實(shí)施例提供一種創(chuàng)建哈希表的方法和設(shè)備,能夠生成非2的正整數(shù)次冪空間的哈希表,減少空間浪費(fèi),降低了實(shí)現(xiàn)的代價。
[0006]第一方面,提供了一種創(chuàng)建哈希表的方法,包括:根據(jù)哈希表的N個哈希子表中第η個哈希子表的空間確定至少兩個哈希子表子空間,其中,第η個哈希子表的空間的大小為非2的正整數(shù)次冪,至少兩個哈希子表子空間的大小為2的正整數(shù)次冪,其中,N為大于或等于2的整數(shù),η = 1,2,…,N ;根據(jù)第η個預(yù)處理哈希函數(shù)將當(dāng)前鍵值映射到至少兩個哈希子表子空間之一,第η個預(yù)處理哈希函數(shù)用于將多個鍵值映射到至少兩個哈希子表子空間中;根據(jù)至少兩個哈希子表子空間之一對應(yīng)的哈希函數(shù)和當(dāng)前鍵值生成第η個哈希子表的哈希桶地址;根據(jù)針對N個哈希子表生成的N個哈希子表的哈希桶地址對應(yīng)的空閑分片數(shù)目將當(dāng)前鍵值存儲在N個哈希子表中的一個哈希子表中。
[0007]結(jié)合第一方面,在第一種可能的實(shí)現(xiàn)方式中,至少兩個哈希子表子空間包括M個哈希子表子空間,至少兩個哈希子表子空間之一為第m個哈希子表子空間,其中,M為大于或等于2的整數(shù),m為1,2,…,M中的數(shù),根據(jù)至少兩個哈希子表子空間之一對應(yīng)的哈希函數(shù)和當(dāng)前鍵值生成第η個哈希子表的哈希桶地址,包括:根據(jù)第m個哈希子表子空間對應(yīng)的哈希函數(shù)和當(dāng)前鍵值生成當(dāng)前鍵值對應(yīng)于第m個哈希子表子空間的哈希桶地址;計(jì)算第I個哈希子表子空間至第m-Ι個哈希子表子空間的大小之和;將當(dāng)前鍵值對應(yīng)于第m個哈希子表子空間的哈希桶地址與第I個哈希子表子空間至第m-Ι個哈希子表子空間的大小之和相加,得到第η個哈希子表的哈希桶地址。
[0008]結(jié)合第一方面或第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,第η個預(yù)處理哈希函數(shù)為循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC)函數(shù),根據(jù)第η個預(yù)處理哈希函數(shù)將當(dāng)前鍵值映射到至少兩個哈希子表子空間之一,包括:根據(jù)第η個預(yù)處理哈希函數(shù)和當(dāng)前鍵值得到預(yù)處理結(jié)果;將預(yù)處理結(jié)果對至少兩個哈希子表子空間中的各空間的比例之和做取模運(yùn)算;根據(jù)取模運(yùn)算的結(jié)果將當(dāng)前鍵值映射到至少兩個哈希子表子空間之
O
[0009]結(jié)合第一方面或第一種和第二種可能的實(shí)現(xiàn)方式中的任一種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,根據(jù)針對N個哈希子表生成的N個哈希子表的哈希桶地址對應(yīng)的空閑分片數(shù)目將當(dāng)前鍵值存儲在N個哈希子表中的一個哈希子表中,包括:確定N個哈希子表生成的N個哈希子表的哈希桶地址中的空閑分片數(shù)目最多的哈希桶地址和空閑分片數(shù)目最多的哈希桶地址對應(yīng)的第P個哈希子表;獲取當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值;將當(dāng)前鍵值存儲在哈希子表的原始鍵值表中;將當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值和當(dāng)前鍵值的索引信息存儲在空閑分片數(shù)目最多的哈希桶地址對應(yīng)的空閑分片上,其中,索引信息指示當(dāng)前鍵值存儲在原始鍵值表中的地址,P為1,2,…,N中的數(shù)。
[0010]結(jié)合第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,獲取當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值;包括:根據(jù)第η個預(yù)處理哈希函數(shù)和至少兩個哈希子表子空間之一對應(yīng)的哈希函數(shù)生成當(dāng)前鍵值的第η個指紋值;將第η個指紋值作為當(dāng)前鍵值對應(yīng)第P個哈希子表的指紋值,其中η不等于P。
[0011]結(jié)合第三種可能的實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,獲取當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值;包括:確定第η個指紋值生成函數(shù);根據(jù)第η個指紋值生成函數(shù)和至少兩個哈希子表子空間之一對應(yīng)的哈希函數(shù)生成當(dāng)前鍵值的第η個指紋值;將第η個指紋值作為當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值,其中η不等于ρ。
[0012]結(jié)合第一方面或第一和第二種可能的實(shí)現(xiàn)方式中的任一種可能的實(shí)現(xiàn)方式,在第六種可能的實(shí)現(xiàn)方式中,根據(jù)針對N個哈希子表生成的N個哈希子表的哈希桶地址對應(yīng)的空閑分片數(shù)目將當(dāng)前鍵值存儲在N個哈希子表中的一個哈希子表中,包括:確定N個哈希子表生成的N個哈希子表的哈希桶地址中的空閑分片數(shù)目最多的哈希桶地址和空閑分片數(shù)目最多的哈希桶地址對應(yīng)的第P個哈希子表;將當(dāng)前鍵值存儲在空閑分片數(shù)目最多的哈希桶地址對應(yīng)的空閑分片上,P為1,2,…,N中的數(shù)。
[0013]結(jié)合第一方面或第一至第六種可能的實(shí)現(xiàn)方式中的任一種可能的實(shí)現(xiàn)方式,在第七種可能的實(shí)現(xiàn)方式中,N = 2,哈希子表為2-left哈希子表。
[0014]第二方面,提供了一種創(chuàng)建哈希表的設(shè)備,包括確定單元,用于根據(jù)哈希表的N個哈希子表中第η個哈希子表的空間確定至少兩個哈希子表子空間,其中,第η個哈希子表的空間的大小為非2的正整數(shù)次冪,至少兩個哈希子表子空間的大小為2的正整數(shù)次冪,其中,N為大于或等于2的整數(shù),η = I, 2,…,N ;映射單元,用于根據(jù)第η個預(yù)處理哈希函數(shù)將當(dāng)前鍵值映射到至少兩個哈希子表子空間之一,第η個預(yù)處理哈希函數(shù)用于將多個鍵值映射到至少兩個哈希子表子空間中;生成單元,用于根據(jù)至少兩個哈希子表子空間之一對應(yīng)的哈希函數(shù)和當(dāng)前鍵值生成哈希子表的哈希桶地址;存儲單元,用于根據(jù)針對N個哈希子表生成的N個哈希子表的哈希桶地址對應(yīng)的空閑分片數(shù)目將當(dāng)前鍵值存儲在N個哈希子表中的一個哈希子表中。
[0015]結(jié)合第二方面,在第一種可能的實(shí)現(xiàn)方式中,至少兩個哈希子表子空間包括M個哈希子表子空間,至少兩個哈希子表子空間之一為第m個哈希子表子空間,其中,M為大于或等于2的整數(shù),m為1,2,…,M中的數(shù),生成單元根據(jù)第m個哈希子表子空間對應(yīng)的哈希函數(shù)和當(dāng)前鍵值生成當(dāng)前鍵值對應(yīng)于第m個哈希子表子空間的哈希桶地址,計(jì)算第I個哈希子表子空間至第m-Ι個哈希子表子空間的大小之和,并將當(dāng)前鍵值對應(yīng)于第m個哈希子表子空間的哈希桶地址與第I個哈希子表子空間至第m-Ι個哈希子表子空間的大小之和相加,得到哈希子表的哈希桶地址。
[0016]結(jié)合第二方面或第二方面的第一種可能的實(shí)現(xiàn)方式,在第二種可能的實(shí)現(xiàn)方式中,第η個預(yù)處理哈希函數(shù)為CRC函數(shù),映射單元根據(jù)第η個預(yù)處理哈希函數(shù)和當(dāng)前鍵值得到預(yù)處理結(jié)果,將預(yù)處理結(jié)果對至少兩個哈希子表子空間中的各空間的比例之和做取模運(yùn)算,并根據(jù)取模運(yùn)算的結(jié)果將當(dāng)前鍵值映射到至少兩個哈希子表子空間之一。
[0017]結(jié)合第二方面或第二方面的第一和第二種可能的實(shí)現(xiàn)方式中的任一種可能的實(shí)現(xiàn)方式,在第三種可能的實(shí)現(xiàn)方式中,存儲單元確定N個哈希子表生成的N個哈希子表的哈希桶地址中的空閑分片數(shù)目最多的哈希桶地址和空閑分片數(shù)目最多的哈希桶地址對應(yīng)的第P個哈希子表,獲取當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值,將當(dāng)前鍵值存儲在哈希子表的原始鍵值表中,并將當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值和當(dāng)前鍵值的索引信息存儲在空閑分片數(shù)目最多的哈希桶地址對應(yīng)的空閑分片上,其中,索引信息指示當(dāng)前鍵值存儲在原始鍵值表中的地址,P為1,2,…,N中的數(shù)。
[0018]結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第四種可能的實(shí)現(xiàn)方式中,存儲單元根據(jù)第η個預(yù)處理哈希函數(shù)和至少兩個哈希子表子空間之一對應(yīng)的哈希函數(shù)生成當(dāng)前鍵值的第η個指紋值,并將第η個指紋值作為當(dāng)前鍵值對應(yīng)第ρ個哈希子表的指紋值,其中η不等于P。
[0019]結(jié)合第二方面的第三種可能的實(shí)現(xiàn)方式,在第五種可能的實(shí)現(xiàn)方式中,存儲單元確定第η個指紋值生成函數(shù),根據(jù)第η個指紋值生成函數(shù)和至少兩個哈希子表子空間之一對應(yīng)的哈希函數(shù)生成當(dāng)前鍵值的第η個指紋值,并將第η個指紋值作為當(dāng)前鍵值對應(yīng)于第P個哈希子表的指紋值,其中η不等于P。
[0020]結(jié)合第二方面或第二方面的第一和第二種可能的實(shí)現(xiàn)方式中的任一種可能的實(shí)現(xiàn)方式,在第六種可能的實(shí)現(xiàn)方式中,存儲單元確定N個哈希子表生成的N個哈希子表的哈希桶地址中的空閑分片數(shù)目最多的哈希桶地址和空閑分片數(shù)目最多的哈希桶地址對應(yīng)的第P個哈希子表,并將當(dāng)前鍵值存儲在空閑分片數(shù)目最多的哈希桶地址對應(yīng)的空閑分片上,P為1,2,…,N中的數(shù)。
[0021]結(jié)合第二方面或第二方面的第一至第六種可能的實(shí)現(xiàn)方式中的任一種可能的實(shí)現(xiàn)方式,在第七種可能的實(shí)現(xiàn)方式中,N = 2,哈希表為2-left哈希表。
[0022]基于上述技術(shù)方案,通過根據(jù)哈希表的N個非2的正整數(shù)次冪空間的哈希子表中的每個哈希子表的空間確定至少兩個2的正整數(shù)次冪的哈希子表子空間,進(jìn)而對當(dāng)前鍵值做分析,根據(jù)針對該N個哈希子表生成的哈希子表的哈希桶地址對應(yīng)的空閑分片數(shù)目將當(dāng)前鍵值存儲在N個哈希子表中的一個哈希子表中,能夠生成非2的正整數(shù)次冪空間的哈希子表,使得該N個哈希子表構(gòu)成的非2的正整數(shù)次冪空間的哈希表可以更好的匹配表項(xiàng)的需求,減少空間浪費(fèi),降低了實(shí)現(xiàn)的代價。
【附圖說明】
[0023]為了更清楚地說明本發(fā)明實(shí)施例的技術(shù)方案,下面將對本發(fā)明實(shí)施例中所需要使用的附圖作簡單地介紹,顯而易見地,下面所描述的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0024]圖1是為本發(fā)明一個實(shí)施例的創(chuàng)建哈希表的方法流程示意圖。
[0025]圖2是為本發(fā)明另一實(shí)施例的創(chuàng)建哈希表的方法流程示意圖。
[0026]圖3是為本發(fā)明實(shí)施例的哈希表的示意圖。
[0027]圖4是為本發(fā)明一個實(shí)施例的創(chuàng)建哈希表的設(shè)備示意性框圖。
[0028]圖5是為本發(fā)明另一實(shí)施例的創(chuàng)建哈希表的設(shè)備示意性框圖。
【具體實(shí)施方式】
[0029]下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明的一部分實(shí)施例,而不是全部實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動的前提下所獲得的所有其他實(shí)施例,