本發(fā)明涉及計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)領(lǐng)域,尤其是涉及一種降低哈希(Hash)沖突概率的方法及裝置。
背景技術(shù):
哈希(Hash)表是根據(jù)關(guān)鍵值(key)而直接進(jìn)行訪問(wèn)的數(shù)據(jù)結(jié)構(gòu),它通過(guò)把關(guān)鍵碼值映射到表項(xiàng)中一個(gè)位置(index)來(lái)存儲(chǔ),以加快數(shù)據(jù)查找的速度。其中,此映射函數(shù)叫做哈希函數(shù)(f),而存放記錄的數(shù)組便是哈希表,哈希表的數(shù)學(xué)表達(dá)式為:index=f(key)。在網(wǎng)絡(luò)通信領(lǐng)域以路由查找為例,哈希函數(shù)輸入值(key)的有效范圍是整個(gè)地址空間,哈希函數(shù)輸出值(Index)有效范圍是系統(tǒng)支持該表項(xiàng)的最大規(guī)格。顯然,輸出值的有效范圍遠(yuǎn)遠(yuǎn)小于輸入值的有效范圍,在這個(gè)前提下,無(wú)論怎么去構(gòu)造哈希函數(shù)(f),都不可避免會(huì)出現(xiàn)key1≠key2,而f(key1)=f(key2)的情況,此情況便為哈希沖突。
現(xiàn)有技術(shù)中,可根據(jù)存儲(chǔ)數(shù)據(jù)的不同來(lái)選擇不同的Hash函數(shù),以降低沖突概率。但是該方式需要根據(jù)不同的數(shù)據(jù)模型來(lái)選擇,不夠靈活。還可針對(duì)同一Hash值入口,增加該入口下所掛載鏈表的深度,即擴(kuò)充表項(xiàng)空間。除上述兩種方式外,常用的解決哈希沖突的方法為“建立公共溢出區(qū)”,此方法將發(fā)生哈希沖突的數(shù)據(jù)存放于TCAM(三態(tài)可尋址寄存器)里面,然而,上述方法雖然可在一定程度避免哈希沖突的發(fā)生,但由于TCAM空間有限,且成本高昂,如果哈希沖突率高,而TCAM空間不足,那么會(huì)導(dǎo)致沖突的表項(xiàng)無(wú)處存放,額外增設(shè)TCAM也勢(shì)必提高整個(gè)設(shè)備的成本。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的缺陷,提供一種降低Hash沖突概率的方法及裝置,以實(shí)現(xiàn)在不擴(kuò)大物理存儲(chǔ)器(Memory)的前提下,有效的減少?zèng)_突概率。
為實(shí)現(xiàn)上述目的,本發(fā)明提出如下技術(shù)方案:一種降低Hash沖突概率的方法,所述方法包括:將一塊物理存儲(chǔ)器分成多塊,每一塊存儲(chǔ)器使用一個(gè)Hash算法進(jìn)行Hash運(yùn)算,得到多個(gè)hash值對(duì)應(yīng)的鏈表入口,然后再用Hash算法輸入的key與存儲(chǔ)器存儲(chǔ)條目?jī)?nèi)的數(shù)據(jù)進(jìn)行一一比對(duì),為當(dāng)前需要存儲(chǔ)的數(shù)據(jù)找到一個(gè)空的存儲(chǔ)條目,其中,每塊存儲(chǔ)器使用的Hash算法均不相同,且分成后的每塊存儲(chǔ)器的存儲(chǔ)深度小于原存儲(chǔ)器。
優(yōu)選地,所述Hash算法用到的Hash函數(shù)為本原多項(xiàng)式。
優(yōu)選地,分成的每塊存儲(chǔ)器的存儲(chǔ)深度均等或不均等。
本發(fā)明還提出了另外一種技術(shù)方案:一種降低Hash沖突概率的方法,所述方法包括:將一塊物理存儲(chǔ)器從邏輯上分成多塊,每塊存儲(chǔ)器應(yīng)用一個(gè)Hash算法進(jìn)行Hash運(yùn)算,得到多個(gè)hash值對(duì)應(yīng)的鏈表入口,然后再用Hash算法輸入的key與存儲(chǔ)器存儲(chǔ)條目?jī)?nèi)的數(shù)據(jù)進(jìn)行一一比對(duì),為當(dāng)前需要存儲(chǔ)的數(shù)據(jù)找到一個(gè)空的存儲(chǔ)條目,其中,每塊存儲(chǔ)器使用的Hash算法均不相同,且分成后的每塊存儲(chǔ)器的存儲(chǔ)深度與原存儲(chǔ)器保持一致。
本發(fā)明還提出了另外一種技術(shù)方案:一種降低Hash沖突概率的裝置,所述裝置包括:分塊模塊、Hash運(yùn)算模塊和比對(duì)模塊,所述分塊模塊用于將一塊物理存儲(chǔ)器分成多塊,分成后的每塊存儲(chǔ)器對(duì)應(yīng)一個(gè)所述Hash運(yùn)算模塊;所述Hash運(yùn)算模塊用于對(duì)其對(duì)應(yīng)的存儲(chǔ)器使用一個(gè)Hash算法進(jìn)行Hash運(yùn)算,得到多個(gè)hash值對(duì)應(yīng)的鏈表入口;所述比對(duì)模塊用于用Hash算法輸入的key與存儲(chǔ)器存儲(chǔ)條目?jī)?nèi)的數(shù)據(jù)相一一比對(duì),為當(dāng)前需要存儲(chǔ)的數(shù)據(jù)找到一個(gè)空的存儲(chǔ)條目,其中,所述Hash運(yùn)算模塊之間使用的Hash算法均不相同,且由所述分塊模塊分成的存儲(chǔ)器的存儲(chǔ)深度小于或等于原存儲(chǔ)器的深度。
優(yōu)選地,所述分塊模塊將一塊物理存儲(chǔ)器分成多塊存儲(chǔ)深度均等或不均等的存儲(chǔ)器。
與現(xiàn)有技術(shù)不同,本發(fā)明通過(guò)將一塊存儲(chǔ)器分成多塊,每塊使用不同的Hash算法進(jìn)行運(yùn)算,在不擴(kuò)大物理存儲(chǔ)器(Memory)的前提下,有效的減少?zèng)_突概率。
附圖說(shuō)明
圖1是本發(fā)明實(shí)施例1降低Hash沖突概率的方法的流程示意圖;
圖2是本發(fā)明實(shí)施例1降低Hash沖突概率的方法的原理示意圖;
圖3是本發(fā)明實(shí)施例2降低Hash沖突概率的方法的流程示意圖;
圖4是本發(fā)明實(shí)施例2降低Hash沖突概率的方法的原理示意圖;
圖5是本發(fā)明降低Hash沖突概率的裝置的模塊示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明的附圖,對(duì)本發(fā)明實(shí)施例的技術(shù)方案進(jìn)行清楚、完整的描述。
本發(fā)明所揭示的一種降低Hash沖突概率的方法及裝置,通過(guò)對(duì)同一個(gè)物理存儲(chǔ)器(Memory)進(jìn)行多次邏輯上的hash運(yùn)算,從而在Memory帶寬允許的前提下,降低hash表的沖突概率。本發(fā)明為降低hash表沖突概率,提出了兩個(gè)技術(shù)方案,即實(shí)施例1和實(shí)施例2,下面將對(duì)這兩個(gè)實(shí)施例進(jìn)行具體描述。
結(jié)合圖1和圖2所示,本發(fā)明實(shí)施例1所揭示的一種降低Hash沖突概率的方法,包括以下步驟:
步驟1,將一塊物理存儲(chǔ)器從邏輯上分成多塊,分成后的每塊存儲(chǔ)器的存儲(chǔ)深度小于原存儲(chǔ)器的存儲(chǔ)深度。
比如一塊物理上32K深度的物理Memory,可以從邏輯上從上至下劃分成四塊8K的Memory,即將一塊物理Memory分成了四塊,每塊的存儲(chǔ)深度是均等的,當(dāng)然分成的多塊存儲(chǔ)器的存儲(chǔ)深度也可以是不均等的。
步驟2,每一塊存儲(chǔ)器使用一個(gè)Hash算法進(jìn)行Hash運(yùn)算,得到多個(gè)hash值對(duì)應(yīng)的鏈表入口,每塊存儲(chǔ)器使用的Hash算法均不相同。
即每塊存儲(chǔ)器采用與其他存儲(chǔ)器不同的Hash算法進(jìn)行運(yùn)算,如上述分成的四塊Memory,為描述方便,可以標(biāo)記為Memory1、Memory2、Memory3、Memory4,每塊采用不同的Hash函數(shù)來(lái)計(jì)算,如對(duì)于當(dāng)前需要存儲(chǔ)的數(shù)據(jù),Memory1、Memory2、Memory3和Memory4分別采用各自對(duì)應(yīng)的Hash函數(shù)計(jì)算得到一個(gè)hash值。
優(yōu)選地,本實(shí)施例中,每塊存儲(chǔ)器采用的Hash函數(shù)選用本原多項(xiàng)式,每塊存儲(chǔ)器之間的采用的本原多項(xiàng)式是不同的且是互質(zhì)的。如每塊邏輯的Memory中對(duì)應(yīng)使用x13+x8+x6+x+1、x13+x7+x6+x+1、x13+x5+x2+x+1、x13+x4+x3+x+1這幾個(gè)不同的本原多項(xiàng)式做Hash運(yùn)算,即Memory1可對(duì)應(yīng)采用x13+x8+x6+x+1,Memory2可對(duì)應(yīng)采用x13+x7+x6+x+1,Memory3可對(duì)應(yīng)采用x13+x5+x2+x+1,Memory4可對(duì)應(yīng)采用x13+x4+x3+x+1,計(jì)算得到不同的Hash值。由于本原多項(xiàng)式相互之間是互質(zhì)的,能夠很好的平衡各個(gè)邏輯Memory之間的Hash算法。
同樣地,這里的Hash函數(shù)也可優(yōu)選使用本原多項(xiàng)式。
步驟3,將Hash算法輸入的key與存儲(chǔ)器存儲(chǔ)條目?jī)?nèi)的數(shù)據(jù)進(jìn)行一一比對(duì),為當(dāng)前需要存儲(chǔ)的數(shù)據(jù)找到一個(gè)空的存儲(chǔ)條目。
即判斷鏈表入口對(duì)應(yīng)的存儲(chǔ)條目中是否已存有數(shù)據(jù),如果沒(méi)有,則該條目為空的,表明可以存儲(chǔ)數(shù)據(jù),此時(shí)可將當(dāng)前需要存儲(chǔ)的數(shù)據(jù)存儲(chǔ)到該存儲(chǔ)條目中。
這樣,本發(fā)明實(shí)施例1產(chǎn)生的Hash沖突概率相當(dāng)于用多塊物理Memory所得到的沖突概率。
結(jié)合圖3和圖4所示,本發(fā)明實(shí)施例2所揭示的一種降低Hash沖突概率的方法,包括以下步驟:
步驟1,將一塊物理存儲(chǔ)器從邏輯上分成多塊,分成后的每塊存儲(chǔ)器的存儲(chǔ)深度與原存儲(chǔ)器的存儲(chǔ)深度保持一致,每塊存儲(chǔ)器對(duì)應(yīng)的Hash算法不同。
比如一塊物理上32K深度的物理Memory,可以從邏輯上分成四塊32K的Memory,為描述方便,可以標(biāo)記為Memory1、Memory2、Memory3、Memory4。即將一塊物理Memory從邏輯上分成了四塊,每塊的存儲(chǔ)深度是均等的,每塊物理Memory對(duì)應(yīng)一個(gè)Hash算法,每塊物理Memory之間Hash算法互不相同。如Memory1對(duì)應(yīng)Hash1,Memory2對(duì)應(yīng)Hash2,Memory3對(duì)應(yīng)Hash3,Memory4對(duì)應(yīng)Hash4。
步驟2,每一塊存儲(chǔ)器使用一個(gè)Hash算法進(jìn)行Hash運(yùn)算,得到一個(gè)hash值對(duì)應(yīng)的鏈表入口,每塊存儲(chǔ)器使用的Hash算法均不相同。
即將原存儲(chǔ)器采用不同的Hash算法進(jìn)行多次Hash運(yùn)算,如上述分成的四塊Memory,每塊采用不同的Hash函數(shù)來(lái)計(jì)算,如對(duì)于當(dāng)前需要存儲(chǔ)的數(shù)據(jù),Memory1、Memory2、Memory3和Memory4分別采用各自對(duì)應(yīng)的Hash函數(shù)計(jì)算得到一個(gè)hash值,每個(gè)hash值對(duì)應(yīng)hash表的一個(gè)鏈表入口。
優(yōu)選地,本實(shí)施例中,存儲(chǔ)器采用的Hash函數(shù)選用本原多項(xiàng)式,且采用的多個(gè)本原多項(xiàng)式是不同的且是互質(zhì)的。如將原始存儲(chǔ)器使用x13+x8+x6+x+1、x13+x7+x6+x+1、x13+x5+x2+x+1、x13+x4+x3+x+1這幾個(gè)不同的本原多項(xiàng)式做4次Hash運(yùn)算,計(jì)算得到不同的Hash值。由于本原多項(xiàng)式相互之間是互質(zhì)的,能夠很好的平衡各個(gè)邏輯Memory之間的Hash算法。
步驟3,將Hash算法輸入的key與存儲(chǔ)器存儲(chǔ)條目?jī)?nèi)的數(shù)據(jù)進(jìn)行一一比對(duì),為當(dāng)前需要存儲(chǔ)的數(shù)據(jù)找到一個(gè)空的存儲(chǔ)條目。
即判斷鏈表入口對(duì)應(yīng)的存儲(chǔ)條目中是否已存有數(shù)據(jù),如果沒(méi)有,則該條目為空的,表明可以存儲(chǔ)數(shù)據(jù),此時(shí)可將當(dāng)前需要存儲(chǔ)的數(shù)據(jù)存儲(chǔ)到該存儲(chǔ)條目中。理論上只要對(duì)同一物理Memory應(yīng)用多次不同的hash算法,總是能夠?yàn)楫?dāng)前需要存儲(chǔ)的數(shù)據(jù)找到一個(gè)空的條目,從而能有效降低hash沖突發(fā)生概率。
這樣,本發(fā)明實(shí)施例1和實(shí)施例2產(chǎn)生的Hash沖突概率相當(dāng)于用多塊物理Memory所得到的沖突概率。
對(duì)應(yīng)的,結(jié)合圖5所示,本發(fā)明所揭示的一種降低Hash沖突概率的裝置,包括:
分塊模塊,用于將一塊物理存儲(chǔ)器分成多塊,分成的存儲(chǔ)器的存儲(chǔ)深度小于或等于原存儲(chǔ)器的深度。
如上述將一塊物理上32K深度的物理Memory,從上至下劃分成四塊8K的Memory,當(dāng)然,分成的多塊存儲(chǔ)器的存儲(chǔ)深度也可以是不均等的?;蛘邔⒁粔K物理上32K深度的物理Memory從邏輯上分為四塊32K深度的物理Memory。
Hash運(yùn)算模塊,用于對(duì)其對(duì)應(yīng)的存儲(chǔ)器使用一個(gè)Hash算法進(jìn)行Hash運(yùn)算,得到多個(gè)hash值對(duì)應(yīng)的鏈表入口。分成后的每塊存儲(chǔ)器對(duì)應(yīng)一個(gè)Hash運(yùn)算模塊,且Hash運(yùn)算模塊之間使用的Hash算法均不相同。
優(yōu)選地,Hash運(yùn)算模塊采用的Hash函數(shù)優(yōu)選為本原多項(xiàng)式。
比對(duì)模塊,用于將Hash算法輸入的key與存儲(chǔ)器存儲(chǔ)條目?jī)?nèi)的數(shù)據(jù)相一一比對(duì),為當(dāng)前需要存儲(chǔ)的數(shù)據(jù)找到一個(gè)空的存儲(chǔ)條目。
每個(gè)模塊的具體實(shí)現(xiàn)原理可參照上述方法中的具體描述,這里不再贅述。
本發(fā)明的技術(shù)內(nèi)容及技術(shù)特征已揭示如上,然而熟悉本領(lǐng)域的技術(shù)人員仍可能基于本發(fā)明的教示及揭示而作種種不背離本發(fā)明精神的替換及修飾,因此,本發(fā)明保護(hù)范圍應(yīng)不限于實(shí)施例所揭示的內(nèi)容,而應(yīng)包括各種不背離本發(fā)明的替換及修飾,并為本專(zhuān)利申請(qǐng)權(quán)利要求所涵蓋。