一種對多階哈希進(jìn)行優(yōu)化的方法及裝置制造方法
【專利摘要】本發(fā)明提出一種對多階哈希進(jìn)行優(yōu)化的方法及裝置,其中方法包括:向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。本發(fā)明能夠提高多階哈希的填充率。
【專利說明】一種對多階哈希進(jìn)行優(yōu)化的方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及多階哈?!炯夹g(shù)領(lǐng)域】,尤其涉及一種對多階哈希進(jìn)行優(yōu)化的方法和裝置。
【背景技術(shù)】
[0002]多階哈希是一種優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),其具有高性能、可重入、穩(wěn)定、健壯、多執(zhí)行流安全、可自淘汰等優(yōu)點。多階哈希的實現(xiàn)過程如下:
[0003]預(yù)設(shè)N個大素數(shù),每一個大素數(shù)作為每一階哈希桶的長度;
[0004]需要存儲新的數(shù)據(jù)時,使用該新數(shù)據(jù)的鍵值對當(dāng)前階哈希桶的長度取余,得到尋址位置,如果該尋址位置上已經(jīng)保存有沖突數(shù)據(jù),則向下一階進(jìn)行哈希計算;否則,將該新的數(shù)據(jù)保存在該尋址位置中;
[0005]向多階哈希存儲數(shù)據(jù)時,最大可沖突次數(shù)為多階哈希的階數(shù)。
[0006]如圖1為現(xiàn)有技術(shù)中一個多階哈希的存儲結(jié)構(gòu)示意圖。該多階哈希的階數(shù)為6階,由上至下的階數(shù)依次增大。每一階哈希桶包括多個存儲位置,其中斜線格表示已保存有沖突數(shù)據(jù)的位置(即已用位置),空白格表示沒有保存沖突數(shù)據(jù)的位置(即可用位置)。
[0007]向該多階哈希插入新的數(shù)據(jù)A時,根據(jù)A的鍵值(記為KeyA)計算A在第I階的尋址位置,發(fā)現(xiàn)該尋址位置為已用位置,則繼續(xù)向第2階尋址;根據(jù)KeyA計算A在第2階的尋址位置,發(fā)現(xiàn)該尋址位置為已用位置,則繼續(xù)向第3階尋址;根據(jù)KeyA計算A在第3階的尋址位置,發(fā)現(xiàn)該尋址位置為可用位置,則將A保存在該第3階的可用位置中。如果對A —直尋址到最高階,發(fā)現(xiàn)最高階的尋址位置仍為已用位置,則判定對數(shù)據(jù)A的插入失敗。
[0008]由以上過程可見,現(xiàn)有的哈希算法在對需要插入的新數(shù)據(jù)尋址時,如果每一階的尋址位置均不可用,則直接判定對新數(shù)據(jù)的插入失敗;然而,此時可能多階哈希中尚存在空閑的位置沒有使用,這就導(dǎo)致現(xiàn)有多階哈希的填充率低。
【發(fā)明內(nèi)容】
[0009]本發(fā)明提出一種多階哈希進(jìn)行優(yōu)化的方法及裝置,能夠提高多階哈希的填充率。
[0010]本發(fā)明的技術(shù)方案是這樣實現(xiàn)的:
[0011]一種對多階哈希進(jìn)行優(yōu)化的方法,包括:
[0012]向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;
[0013]如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。
[0014]向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;
[0015]如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。
[0016]一種對多階哈希進(jìn)行優(yōu)化的裝置,包括:
[0017]探測模塊,用于當(dāng)向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;
[0018]保存模塊,用于當(dāng)存在探測成功的沖突數(shù)據(jù)時,將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述新的數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。
[0019]可見,本發(fā)明提出的對多階哈希進(jìn)行優(yōu)化的方法和裝置,在對需要插入的新數(shù)據(jù)尋址時,如果每一個尋址位置均不可用,則判斷其所有尋址位置上的沖突數(shù)據(jù)是否能夠向更高階轉(zhuǎn)移,如果能,則將該沖突數(shù)據(jù)向更高階轉(zhuǎn)移,并將新的待插入數(shù)據(jù)插入該沖突數(shù)據(jù)的初始位置。通過這種方式,能夠提高多階哈希的填充率。
【專利附圖】
【附圖說明】
[0020]圖1為現(xiàn)有技術(shù)中一個多階哈希的存儲結(jié)構(gòu)示意圖;
[0021]圖2為本發(fā)明提出的對多階哈希進(jìn)行優(yōu)化的方法流程圖;
[0022]圖3為本發(fā)明實施例一的示意圖1 ;
[0023]圖4為本發(fā)明實施例一的示意圖2 ;
[0024]圖5為本發(fā)明實施例一的示意圖3 ;
[0025]圖6為本發(fā)明實施例一的示意圖4 ;
[0026]圖7為本發(fā)明實施例二的示意圖1 ;
[0027]圖8為本發(fā)明實施例二的示意圖2 ;
[0028]圖9為本發(fā)明實施例二的示意圖3 ;
[0029]圖10為對現(xiàn)有的多階哈希、本發(fā)明提出的基于探測的多階哈希、進(jìn)一步改進(jìn)后的基于探測的類Cuckoo哈希的填充率比較結(jié)果示意圖;
[0030]圖11為對現(xiàn)有的多階哈希、本發(fā)明提出的基于探測的多階哈希、進(jìn)一步改進(jìn)后的基于探測的類Cuckoo哈希的寫效率(每秒)比較結(jié)果示意圖;
[0031]圖12為對現(xiàn)有的多階哈希、本發(fā)明提出的基于探測的多階哈希、進(jìn)一步改進(jìn)后的基于探測的類Cuckoo哈希的讀效率(每秒)比較結(jié)果示意圖;
[0032]圖13為對數(shù)據(jù)規(guī)模為2700W的20階普通多階哈希、數(shù)據(jù)規(guī)模為700W的5階基于探測的類Cuckoo哈希和數(shù)據(jù)規(guī)模為2700W的5階基于探測的類Cuckoo哈希的填充率的比較結(jié)果示意圖;
[0033]圖14為對數(shù)據(jù)規(guī)模為2700W的20階普通多階哈希、數(shù)據(jù)規(guī)模為700W的5階基于探測的類Cuckoo哈希和數(shù)據(jù)規(guī)模為2700W的5階基于探測的類Cuckoo哈希的寫效率(每秒)的比較結(jié)果示意圖;
[0034]圖15為對數(shù)據(jù)規(guī)模為2700W的20階普通多階哈希、數(shù)據(jù)規(guī)模為700W的5階基于探測的類Cuckoo哈希和數(shù)據(jù)規(guī)模為2700W的5階基于探測的類Cuckoo哈希的讀效率(每秒)的比較結(jié)果示意圖。
【具體實施方式】
[0035]本發(fā)明提出一種對多階哈希進(jìn)行優(yōu)化的方法,如圖2為該方法實現(xiàn)流程圖,包括:
[0036]步驟201:向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;
[0037]步驟202:如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。
[0038]上述過程中,將沖突數(shù)據(jù)向更高階進(jìn)行探測的方式具體可以為:根據(jù)所述沖突數(shù)據(jù)的鍵值計算該沖突數(shù)據(jù)在更高階上的尋址位置,當(dāng)發(fā)現(xiàn)空閑的尋址位置時,判定該沖突數(shù)據(jù)探測成功,將該空閑的尋址位置作為該沖突數(shù)據(jù)探測成功的位置。
[0039]具體實現(xiàn)時,將所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測時,可以維護(hù)一個變量,該變量的初始值為所述多階哈希的階數(shù)加I ;如果沖突數(shù)據(jù)探測成功,則判斷該沖突數(shù)據(jù)探測成功位置的階數(shù)是否小于該變量,如果小于,則將該變量的值修改為該從今天數(shù)據(jù)探測成功位置的階數(shù),繼續(xù)對更高階沖突數(shù)據(jù)的探測;當(dāng)所有沖突數(shù)據(jù)探測完畢之后,如果所述變量的值不大于所述多階哈希的階數(shù),則判定存在探測成功的沖突數(shù)據(jù)。
[0040]也就是說,對于一個新插入的數(shù)據(jù),根據(jù)其鍵值key計算該數(shù)據(jù)在每一階的尋址位置,如果每一階哈希都沒有空位予以插入的話,那么將每一階與key產(chǎn)生沖突的值去其更高階的地方嘗試,看是否有空位予以插入。如果有,則取出一個可替換階數(shù)最低的進(jìn)行替換,再將替換出的值放到探測的位置上。
[0041]以下舉具體的實施例對上述方法做詳細(xì)介紹。
[0042]實施例一:
[0043]在本實施例中,需要將新的數(shù)據(jù)A插入一個6階哈希。如圖3-圖6顯示了本實施例對數(shù)據(jù)A的插入過程。
[0044]在圖3中,根據(jù)數(shù)據(jù)A的鍵值KeyA計算在每一階的尋址位置,發(fā)現(xiàn)所有尋址位置上均已保存有沖突數(shù)據(jù),分別是B、C、D、E、F和G。
[0045]由于所有尋址位置均不可用,則將所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測。如圖4和圖5所示。
[0046]在圖4中,將數(shù)據(jù)B向更高階進(jìn)行探測,即根據(jù)數(shù)據(jù)B的鍵值KeyB計算在更高階上的尋址位置,發(fā)現(xiàn)在第5階上的尋址位置空閑,則認(rèn)為數(shù)據(jù)B的探測成功,且記錄該探測成功位置的階數(shù)5。
[0047]在圖5中,繼續(xù)將數(shù)據(jù)C向更高階進(jìn)行探測,即根據(jù)數(shù)據(jù)C的鍵值KeyC計算在更高階上的尋址位置,發(fā)現(xiàn)在第3階上的尋址位置空閑,則認(rèn)為數(shù)據(jù)C的探測成功,且記錄該探測成功位置的階數(shù)3。
[0048]之后,繼續(xù)將D、E、F、G向更高階進(jìn)行探測,這些數(shù)據(jù)更高階上的尋址位置均已被占用,故探測失敗。
[0049]探測完成之后,對數(shù)據(jù)A執(zhí)行插入。如圖6所示,由于數(shù)據(jù)C的探測成功位置的階數(shù)最低,故將數(shù)據(jù)C轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將數(shù)據(jù)A保存在數(shù)據(jù)C的初始位置。
[0050]如果所有數(shù)據(jù)均探測失敗,則認(rèn)為對數(shù)據(jù)A的插入失敗。
[0051]在具體執(zhí)行時,如果在N階哈希中尋址至最高階仍未找到空位插入,那么可以維護(hù)一個變量minRow (初始值為N+1),將尋址路徑上行號小于minRow的每個數(shù)據(jù)都向更高階進(jìn)行探測(對于第i階的一個鍵值,它之所以會位于第i階,是因為在它的路徑上i階之前的位置一定已經(jīng)被占據(jù),因此只向更高階探測),如果探測到一個位置所處階數(shù)小于minRow,那么更新minRow為該階,直至探測結(jié)束。探測結(jié)束后,如果minRow〈=N則進(jìn)行替換,否則認(rèn)為插入失敗。
[0052]以上是本發(fā)明提出的對多階哈希的優(yōu)化方法,稱為基于探測的多階哈希。由于對新數(shù)據(jù)的插入進(jìn)行了一些改變而提升了整個多階哈希的填充率。本發(fā)明還可以對該方法做進(jìn)一步改進(jìn),借鑒現(xiàn)有的Cuckoo Hash算法中將沖突鍵值“擠出”的思想,當(dāng)新插入的數(shù)據(jù)在一次探測后沒有找到可以替換的位置,則嘗試將所有沖突數(shù)據(jù)替換掉,并對被替換掉的沖突數(shù)據(jù)進(jìn)行同樣方案的遞歸探測(替換層數(shù)的門限為預(yù)先設(shè)定的值,如設(shè)置為3層,層數(shù)過多意義不明顯)。這種改進(jìn)后的方法稱為基于探測的類Cuckoo Hash。
[0053]具體地,上述步驟202之后可以進(jìn)一步包括:
[0054]如果不存在探測成功的沖突數(shù)據(jù),則針對該待插入數(shù)據(jù)第一個尋址位置上的沖突數(shù)據(jù)執(zhí)行以下步驟:
[0055]A、采用所述待插入數(shù)據(jù)替換沖突數(shù)據(jù);
[0056]B、將所述沖突數(shù)據(jù)作為新的待插入數(shù)據(jù),將該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述新的待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置,結(jié)束當(dāng)前流程;如果不存在探測成功的沖突數(shù)據(jù),則針對該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)依次執(zhí)行步驟A,直至替換層數(shù)達(dá)到預(yù)先設(shè)置的門限值時,如果仍不存在探測成功的沖突數(shù)據(jù),則將所有被替換的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存,并針對該待插入數(shù)據(jù)下一個尋址位置上的沖突數(shù)據(jù)執(zhí)行步驟A ;
[0057]直至對該待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)均執(zhí)行完畢時,如果仍不存在探測成功的沖突數(shù)據(jù),則判定對該待插入數(shù)據(jù)的插入失敗,將該待插入數(shù)據(jù)的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存。
[0058]其中,對沖突數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測的方式與上述對新的待插入數(shù)據(jù)所有尋址位置上的原有數(shù)據(jù)向更高階進(jìn)行探測的方式相同。
[0059]以下舉具體的實施例對上述改進(jìn)的方法做詳細(xì)介紹。
[0060]實施例二:
[0061]在本實施例中,需要將新的數(shù)據(jù)A插入一個6階哈希。如圖7-圖9顯示了本實施例對數(shù)據(jù)A的插入過程。在本實施例中,以替換層數(shù)的門限值為2層為例進(jìn)行說明。
[0062]在圖7中,根據(jù)數(shù)據(jù)A的鍵值KeyA計算在每一階的尋址位置,發(fā)現(xiàn)所有尋址位置上均已保存有沖突數(shù)據(jù),分別是B、C、D、E、F和G。并且,沖突數(shù)據(jù)B、C、D、E、F和G的探測均不成功,也就是這些沖突數(shù)據(jù)在更高階上的尋址位置均已被占用(圖7僅顯示了數(shù)據(jù)B的探測過程)。
[0063]之后,依次采用A替換其尋址路徑上的所有沖突數(shù)據(jù)B、C、D、E、F和G,將被替換的沖突數(shù)據(jù)進(jìn)行Cuckoo Hash的插入操作。
[0064]如圖8所示,用數(shù)據(jù)A替換數(shù)據(jù)B,此時數(shù)據(jù)B成為新的待插入數(shù)據(jù),對數(shù)據(jù)B進(jìn)行同樣的Cuckoo Hash的插入操作。此時的替換層數(shù)為I層(即A替換掉B)。B的所有尋址位置上的沖突數(shù)據(jù)依次為A — H—I — J — K — L,那么依次用A、H、1、J、K、L的值進(jìn)行探測,如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,將B保存在該沖突數(shù)據(jù)的初始位置。如圖9所示,B的沖突數(shù)據(jù)H的探測成功,且H探測成功位置的階數(shù)最低,則將B保存在H的初始位置,將H保存在其探測成功的位置。至此,對新數(shù)據(jù)A的插入成功,結(jié)束當(dāng)前流程。
[0065]如果對B的所有沖突數(shù)據(jù)探測完成之后,仍然不存在探測成功的沖突數(shù)據(jù),則依次采用B替換掉其尋址路徑上的所有沖突數(shù)據(jù),將該被替換掉的沖突數(shù)據(jù)作為新的待插入數(shù)據(jù),對其進(jìn)行Cuckoo Hash的插入操作。此時替換的層數(shù)為2層(即A替換掉B,B替換掉它的沖突數(shù)據(jù)),達(dá)到預(yù)先設(shè)定的門限值。
[0066]對于B的沖突數(shù)據(jù)H,假定H的所有尋址位置上的沖突數(shù)據(jù)依次為W-B-M-P-Q-V,那么依次用W、B、M、P、Q、V向更高階進(jìn)行探測,如果不存在探測成功的沖突數(shù)據(jù),由于此時的替換層數(shù)已經(jīng)達(dá)到預(yù)先設(shè)定的門限值,故H不能替換掉其沖突數(shù)據(jù),則B繼續(xù)替換其下一尋址位置上的沖突數(shù)據(jù)。直至B已經(jīng)替換過其尋址位置上的所有沖突數(shù)據(jù),仍不存在探測成功的沖突數(shù)據(jù)時,說明對B的探測失敗,則將所有被替換的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存。
[0067]之后,A繼續(xù)替換掉下一個沖突數(shù)據(jù),即數(shù)據(jù)C,此時數(shù)據(jù)C成為新的待插入數(shù)據(jù),對數(shù)據(jù)C進(jìn)行與上述數(shù)據(jù)B同樣的操作。如果仍探測失敗,則A繼續(xù)替換掉下一個沖突數(shù)據(jù),直至對所有沖突數(shù)據(jù)探測完畢之后,如果仍未探測成功,則判定對數(shù)據(jù)A的插入失敗。
[0068]在上述過程中,當(dāng)待插入數(shù)據(jù)A作為某數(shù)據(jù)的沖突數(shù)據(jù)時,可以加上標(biāo)記使其不被替換;當(dāng)然,如果不加標(biāo)記也不會增加太多的額外消耗(因為其探測路徑上必然是全部沖突的,所以只會進(jìn)行一次探測然后回退)。
[0069]基于探測的類Cuckoo Hash進(jìn)一步提升了多階哈希的填充率,并且讀寫性能有質(zhì)的超越。
[0070]以下對現(xiàn)有的多階哈希、本發(fā)明提出的基于探測的多階哈希、進(jìn)一步改進(jìn)后的基于探測的類Cuckoo哈希進(jìn)行測試對比。測試環(huán)境為單線程+B6,數(shù)據(jù)規(guī)模約為2700W,每階哈希約136W,共20階。如圖10-12分別為對三種方法填充率、寫效率(每秒)和讀效率(每秒)的比較結(jié)果示意圖。
[0071]從圖表中可以清晰的看出,在填充率方面基于探測的類Cuckoo hash表現(xiàn)是十分優(yōu)秀的,在5階時已經(jīng)可以達(dá)到96%以上的填充率。我們用5階的基于探測的類Cuckoohash和普通版本的20階哈希進(jìn)行對比:
[0072]利用率高(96.5-83.3)/83.3=15.8%
[0073]寫性能提高(2668997-1391161)/1391161=91.9%
[0074]讀性能提高(2462777-614965)/614965=300.5%
[0075]為什么寫的性能也提高了?其實并不意外,因為階數(shù)降得很低并且有沖突的時候也并不多。
[0076]那么,5階的基于探測的類Cuckoo hash總體數(shù)據(jù)規(guī)模僅為136*5 ^ 700W,而普通20階哈希的數(shù)據(jù)規(guī)模為2700W,這樣的比較有意義嗎?實際上,一個多階哈希的填充率和讀寫性能與每一階的規(guī)模并無太大關(guān)系,我們將類Cuckoo hash的單階規(guī)模增長為540W進(jìn)行對比,如圖13-15分別為對數(shù)據(jù)規(guī)模為2700W的20階普通多階哈希、數(shù)據(jù)規(guī)模為700W的5階基于探測的類Cuckoo哈希和數(shù)據(jù)規(guī)模為2700W的5階基于探測的類Cuckoo哈希的填充率、寫效率(每秒)和讀效率(每秒)的比較結(jié)果示意圖。由這三張圖表我們看出,每一階的規(guī)模對整體效率的影響并不是特別大,相對于普通的多階哈希結(jié)構(gòu),基于探測的類Cuckoohash在填充率、讀寫性能上都有優(yōu)異的表現(xiàn)。
[0077]在實際郵箱后臺業(yè)務(wù)中,在存儲一些稀疏的數(shù)據(jù)時,采用以往的bitmap會浪費(fèi)大量的內(nèi)存,而使用本發(fā)明提出的對多階哈希進(jìn)行優(yōu)化的方法,可以提升多階哈希的填充率,從而極為有效地緩解內(nèi)存壓力。從讀寫效率上來講,本發(fā)明提出的方法也完全能夠滿足業(yè)務(wù)需求。
[0078]本發(fā)明還提出一種對多階哈希進(jìn)行優(yōu)化的裝置,包括:
[0079]探測模塊,用于當(dāng)向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;
[0080]保存模塊,用于當(dāng)存在探測成功的沖突數(shù)據(jù)時,將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述新的數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。
[0081]上述裝置中,探測模塊還用于,如果所述待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)中不存在探測成功的沖突數(shù)據(jù),則針對該待插入數(shù)據(jù)第一個尋址位置上的沖突數(shù)據(jù)執(zhí)行以下步驟:
[0082]A、采用所述待插入數(shù)據(jù)替換沖突數(shù)據(jù);
[0083]B、將所述沖突數(shù)據(jù)作為新的待插入數(shù)據(jù),將該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;如果存在探測成功的沖突數(shù)據(jù),則通知所述保存模塊將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述新的待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置,結(jié)束當(dāng)前流程;如果不存在探測成功的沖突數(shù)據(jù),則針對該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)依次執(zhí)行步驟A,直至替換層數(shù)達(dá)到預(yù)先設(shè)置的門限值時,如果仍不存在探測成功的沖突數(shù)據(jù),則通知所述保存模塊將所有被替換的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存,并針對該待插入數(shù)據(jù)下一個尋址位置上的沖突數(shù)據(jù)執(zhí)行步驟A ;
[0084]直至對該待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)均執(zhí)行完畢時,如果仍不存在探測成功的沖突數(shù)據(jù),則判定對該待插入數(shù)據(jù)的插入失敗,通知所述保存模塊將該待插入數(shù)據(jù)的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存。
[0085]上述裝置中,探測模塊將沖突數(shù)據(jù)向更高階進(jìn)行探測的方式為:根據(jù)所述沖突數(shù)據(jù)的鍵值計算該沖突數(shù)據(jù)在更高階上的尋址位置,當(dāng)發(fā)現(xiàn)空閑的尋址位置時,判定該沖突數(shù)據(jù)探測成功,將該空閑的尋址位置作為該沖突數(shù)據(jù)探測成功的位置。
[0086]探測模塊針對所述待插入數(shù)據(jù)的一個沖突數(shù)據(jù),將所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測時,可以維護(hù)一個變量,該變量的初始值為所述多階哈希的階數(shù)加I ;如果沖突數(shù)據(jù)探測成功,則判斷該沖突數(shù)據(jù)探測成功位置的階數(shù)是否小于該變量,如果小于,則將該變量的值修改為該沖突數(shù)據(jù)探測成功位置的階數(shù),繼續(xù)對更高階沖突數(shù)據(jù)的探測;當(dāng)所有沖突數(shù)據(jù)探測完畢之后,如果所述變量的值不大于所述多階哈希的階數(shù),則判定存在探測成功的沖突數(shù)據(jù)。綜上可見,本發(fā)明提出的對多階哈希進(jìn)行優(yōu)化的方法和裝置,在對需要插入的新數(shù)據(jù)尋址時,如果每一個尋址位置均不可用,則判斷其所有尋址位置上的沖突數(shù)據(jù)是否能夠向更高階轉(zhuǎn)移,如果能,則將該沖突數(shù)據(jù)向更高階轉(zhuǎn)移,并將待插入數(shù)據(jù)插入該沖突數(shù)據(jù)的初始位置。進(jìn)一步地,如果探測失敗,則可以嘗試將其探測路徑上的所以沖突數(shù)據(jù)替換掉,將被替換掉的沖突數(shù)據(jù)作為新的待插入數(shù)據(jù),進(jìn)行同樣方案的遞歸操作,允許替換的層次可以預(yù)先設(shè)置。通過這種方式能夠提高多階哈希的填充率,同時保證較高的讀與性能。
[0087]以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明保護(hù)的范圍之內(nèi)。
【權(quán)利要求】
1.一種對多階哈希進(jìn)行優(yōu)化的方法,其特征在于,所述方法包括: 向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測; 如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法進(jìn)一步包括: 如果不存在探測成功的沖突數(shù)據(jù),則針對該待插入數(shù)據(jù)第一個尋址位置上的沖突數(shù)據(jù)執(zhí)行以下步驟: A、采用所述待插入數(shù)據(jù)替換沖突數(shù)據(jù); B、將所述沖突數(shù)據(jù)作為新的待插入數(shù)據(jù),將該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;如果存在探測成功的沖突數(shù)據(jù),則將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述新的待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置,結(jié)束當(dāng)前流程;如果不存在探測成功的沖突數(shù)據(jù),則針對該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)依次執(zhí)行步驟A,直至替換層數(shù)達(dá)到預(yù)先設(shè)置的門限值時,如果仍不存在探測成功的沖突數(shù)據(jù),則將所有被替換的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存,并針對該待插入數(shù)據(jù)下一個尋址位置上的沖突數(shù)據(jù)執(zhí)行步驟A ; 直至對該待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)均執(zhí)行完畢時,如果仍不存在探測成功的沖突數(shù)據(jù),則判定對該待插入數(shù)據(jù)的插入失敗,將該待插入數(shù)據(jù)的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,所述將沖突數(shù)據(jù)向更高階進(jìn)行探測的方式為:根據(jù)所述沖突數(shù)據(jù)的鍵值計算該沖突數(shù)據(jù)在更高階上的尋址位置,當(dāng)發(fā)現(xiàn)空閑的尋址位置時,判定該沖突數(shù)據(jù)探測成功,將該空閑的尋址位置作為該沖突數(shù)據(jù)探測成功的位置。
4.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,針對所述待插入數(shù)據(jù)的一個沖突數(shù)據(jù),將所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測時,維護(hù)一個變量,該變量的初始值為所述多階哈希的階數(shù)加I ;如果沖突數(shù)據(jù)探測成功,則判斷該沖突數(shù)據(jù)探測成功位置的階數(shù)是否小于該變量,如果小于,則將該變量的值修改為該沖突數(shù)據(jù)探測成功位置的階數(shù),繼續(xù)對更高階沖突數(shù)據(jù)的探測;當(dāng)所有沖突數(shù)據(jù)探測完畢之后,如果所述變量的值不大于所述多階哈希的階數(shù),則判定存在探測成功的沖突數(shù)據(jù)。
5.一種對多階哈希進(jìn)行優(yōu)化的裝置,其特征在于,所述裝置包括: 探測模塊,用于當(dāng)向多階哈希插入新的數(shù)據(jù)時,如果該待插入數(shù)據(jù)所有尋址位置上均已保存沖突數(shù)據(jù),則將所述所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測; 保存模塊,用于當(dāng)存在探測成功的沖突數(shù)據(jù)時,將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述新的數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置。
6.根據(jù)權(quán)利要求5所述的裝置,其特征在于,所述探測模塊還用于,如果所述待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)中不存在探測成功的沖突數(shù)據(jù),則針對該待插入數(shù)據(jù)第一個尋址位置上的沖突數(shù)據(jù)執(zhí)行以下步驟: A、采用所述待插入數(shù)據(jù)替換沖突數(shù)據(jù); B、將所述沖突數(shù)據(jù)作為新的待插入數(shù)據(jù),將該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測;如果存在探測成功的沖突數(shù)據(jù),則通知所述保存模塊將探測成功位置的階數(shù)最低的沖突數(shù)據(jù)轉(zhuǎn)移至該探測成功的位置進(jìn)行保存,并將所述新的待插入數(shù)據(jù)保存在該探測成功位置的階數(shù)最低的沖突數(shù)據(jù)的初始位置,結(jié)束當(dāng)前流程;如果不存在探測成功的沖突數(shù)據(jù),則針對該新的待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)依次執(zhí)行步驟A,直至替換層數(shù)達(dá)到預(yù)先設(shè)置的門限值時,如果仍不存在探測成功的沖突數(shù)據(jù),則通知所述保存模塊將所有被替換的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存,并針對該待插入數(shù)據(jù)下一個尋址位置上的沖突數(shù)據(jù)執(zhí)行步驟A ; 直至對該待插入數(shù)據(jù)所有尋址位置上的沖突數(shù)據(jù)均執(zhí)行完畢時,如果仍不存在探測成功的沖突數(shù)據(jù),則判定對該待插入數(shù)據(jù)的插入失敗,通知所述保存模塊將該待插入數(shù)據(jù)的沖突數(shù)據(jù)返回其初始位置進(jìn)行保存。
7.根據(jù)權(quán)利要求5或6所述的裝置,其特征在于,所述探測模塊將沖突數(shù)據(jù)向更高階進(jìn)行探測的方式為:根據(jù)所述沖突數(shù)據(jù)的鍵值計算該沖突數(shù)據(jù)在更高階上的尋址位置,當(dāng)發(fā)現(xiàn)空閑的尋址位置時,判定該沖突數(shù)據(jù)探測成功,將該空閑的尋址位置作為該沖突數(shù)據(jù)探測成功的位置。
8.根據(jù)權(quán)利要求5或6所述的裝置,其特征在于,將所述探測模塊針對所述待插入數(shù)據(jù)的一個沖突數(shù)據(jù),將所有尋址位置上的沖突數(shù)據(jù)向更高階進(jìn)行探測時,維護(hù)一個變量,該變量的初始值為所述多階哈希的階數(shù)加I ;如果沖突數(shù)據(jù)探測成功,則判斷該沖突數(shù)據(jù)探測成功位置的階數(shù)是否小于該變量,如果小于,則將該變量的值修改為該沖突數(shù)據(jù)探測成功位置的階數(shù),繼續(xù)對更高階沖突數(shù)據(jù)的探測;當(dāng)所有沖突數(shù)據(jù)探測完畢之后,如果所述變量的值不大于所述多階哈希的階數(shù),則判定存在探測成功的沖突數(shù)據(jù)。
【文檔編號】G06F17/30GK104182409SQ201310196974
【公開日】2014年12月3日 申請日期:2013年5月24日 優(yōu)先權(quán)日:2013年5月24日
【發(fā)明者】萬林佳 申請人:騰訊科技(深圳)有限公司