專利名稱::一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的方法及裝置的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明屬于數(shù)據(jù)存儲(chǔ)領(lǐng)域,尤其涉及一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的方法及裝置。
背景技術(shù):
:在一般的線性表或樹(shù)等數(shù)據(jù)結(jié)構(gòu)中,在將數(shù)據(jù)存儲(chǔ)至數(shù)據(jù)結(jié)構(gòu)時(shí),數(shù)據(jù)在數(shù)據(jù)結(jié)構(gòu)中的相對(duì)位置是隨機(jī)的,與數(shù)據(jù)的關(guān)鍵字之間不存在確定的關(guān)系。在數(shù)據(jù)結(jié)構(gòu)中查找數(shù)據(jù)時(shí),需將數(shù)據(jù)的關(guān)鍵字與數(shù)據(jù)結(jié)構(gòu)中記錄的關(guān)鍵字進(jìn)行一系列的比較,才能查找到數(shù)據(jù),查找的效率與比較次數(shù)密切相關(guān),很多情況下,數(shù)據(jù)查找效率低。為了避免這種問(wèn)題,現(xiàn)有技術(shù)一般采用哈希函數(shù)對(duì)需要存儲(chǔ)的數(shù)據(jù)進(jìn)行處理,得到哈希表,使數(shù)據(jù)的關(guān)鍵字與數(shù)據(jù)結(jié)構(gòu)中的唯一的存儲(chǔ)位置相對(duì)應(yīng),從而在查找數(shù)據(jù)時(shí),不需要進(jìn)行比較便可直接取得所查數(shù)據(jù)?,F(xiàn)有的哈希表存儲(chǔ)區(qū)一般是定長(zhǎng)的,即哈希表存儲(chǔ)區(qū)的大小(HashBase值)是固定的,預(yù)先根據(jù)數(shù)據(jù)的存儲(chǔ)需求來(lái)設(shè)定合適的HashBase值。當(dāng)需要存儲(chǔ)的數(shù)據(jù)增大時(shí),則由于這種哈希表存儲(chǔ)區(qū)太小導(dǎo)致產(chǎn)生較多的沖突,降低了哈希算法的效率。如果預(yù)先設(shè)置足夠大的哈希表存儲(chǔ)區(qū),則當(dāng)數(shù)據(jù)量較小時(shí),將導(dǎo)致內(nèi)存的浪費(fèi)。
發(fā)明內(nèi)容本發(fā)明實(shí)施例的目的在于提供一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的方法,旨在解決現(xiàn)有的哈希表不能動(dòng)態(tài)適應(yīng)數(shù)據(jù)而造成的內(nèi)存浪費(fèi)或內(nèi)存不足的問(wèn)題。本發(fā)明實(shí)施例是這樣實(shí)現(xiàn)的,一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的方法,所述方法包括下述步驟A、將內(nèi)存初始化為哈希表存儲(chǔ)區(qū)、哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū);B、當(dāng)檢測(cè)到哈希表不能滿足數(shù)據(jù)的存儲(chǔ)需求時(shí),保持哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū)的數(shù)據(jù)不變,釋放哈希表存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū),采用重新分配哈希表存儲(chǔ)區(qū)之前采用的哈希函數(shù)對(duì)哈希關(guān)鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的哈希表存儲(chǔ)區(qū)中的數(shù)據(jù)。本發(fā)明實(shí)施例的另一目的在于提供一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的裝置,所述裝置包括內(nèi)存初始化單元,用于將內(nèi)存初始化為哈希表存儲(chǔ)區(qū)、哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū);哈希表判斷單元,用于判斷哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求;存儲(chǔ)區(qū)保持單元,用于在所述哈希表判斷單元的結(jié)果為否時(shí),保持哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū)的數(shù)據(jù)不變;哈希表重新分配單元,用于在所述哈希表判斷單元的結(jié)果為否時(shí),釋放哈希表存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū);數(shù)據(jù)重計(jì)算單元,用于在所述哈希表判斷單元的結(jié)果為否時(shí),采用重新分配哈希表存儲(chǔ)區(qū)之前采用的哈希函數(shù)對(duì)哈希關(guān)鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的哈希表存儲(chǔ)區(qū)中的數(shù)據(jù)。在本發(fā)明實(shí)施例中,當(dāng)檢測(cè)到哈希表不能滿足數(shù)據(jù)的存儲(chǔ)需求時(shí),先保持哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)4定值存儲(chǔ)區(qū)的數(shù)據(jù)不變,再釋放,合希表存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存銬區(qū),采用相同的哈希函數(shù)對(duì)哈希關(guān)鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的哈希表存儲(chǔ)區(qū)的數(shù)據(jù),從而使哈希表可以動(dòng)態(tài)的適應(yīng)任意數(shù)據(jù),避免了由于哈希表存儲(chǔ)區(qū)過(guò)大造成的內(nèi)存浪費(fèi)問(wèn)題,由于哈希表存儲(chǔ)區(qū)過(guò)小造成的哈希表存儲(chǔ)區(qū)不能滿足任意數(shù)據(jù)需求,從而導(dǎo)致沖突較多、降低哈希函數(shù)的效率的問(wèn)題。圖1是本發(fā)明實(shí)施例提供的哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的方法的實(shí)現(xiàn)流程圖;圖2是本發(fā)明實(shí)施例提供的哈希表動(dòng)態(tài)擴(kuò)展前的內(nèi)存的數(shù)據(jù)結(jié)構(gòu)圖;圖3是本發(fā)明實(shí)施例提供的哈希表動(dòng)態(tài)擴(kuò)展后的內(nèi)存的數(shù)據(jù)結(jié)構(gòu)圖;圖4是本發(fā)明實(shí)施例提供的哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的裝置的結(jié)構(gòu)框圖。具體實(shí)施例方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。在本發(fā)明實(shí)施例中,當(dāng)檢測(cè)到哈希表不能滿足數(shù)據(jù)的存儲(chǔ)需求時(shí),先保持哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū)的數(shù)據(jù)不變,再釋放哈希表存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū),采用相同的哈希函數(shù)對(duì)哈希關(guān)鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的哈希表存儲(chǔ)區(qū)的數(shù)據(jù),從而使哈希表可以動(dòng)態(tài)的適應(yīng)任意數(shù)據(jù),避免了由于哈希表存儲(chǔ)區(qū)過(guò)大造成的內(nèi)存浪費(fèi)和哈希表存儲(chǔ)區(qū)過(guò)小造成的哈希表存儲(chǔ)區(qū)不能滿足任意數(shù)據(jù)需求的問(wèn)題。詳述如下在步驟S101中,將內(nèi)存初始化為哈希表(HashTable)存儲(chǔ)區(qū)、哈希項(xiàng)(HashItem)存儲(chǔ)區(qū)和哈希關(guān)鍵值(HashKey)存儲(chǔ)區(qū)。在對(duì)內(nèi)存進(jìn)行初始化時(shí),需要根據(jù)當(dāng)前數(shù)據(jù)的存儲(chǔ)需求設(shè)置該HashTable存儲(chǔ)區(qū)的大小HashBase值。在根據(jù)當(dāng)前數(shù)據(jù)的存儲(chǔ)需求設(shè)置HashBase值時(shí),可以設(shè)置為大于或者等于當(dāng)前待存儲(chǔ)的數(shù)據(jù)量的2倍的最小質(zhì)數(shù)。在本發(fā)明實(shí)'算得到頂%,的。HashItem存儲(chǔ)區(qū)用于存儲(chǔ)數(shù)據(jù)的信息。其中數(shù)據(jù)的信息包括但不限于數(shù)據(jù)的真實(shí)地址和長(zhǎng)度。該HashItem存儲(chǔ)區(qū)的大小根據(jù)需要存儲(chǔ)的數(shù)據(jù)的增加而增加。在本發(fā)明實(shí)施例中,根據(jù)HashTable存儲(chǔ)區(qū)中存儲(chǔ)的HashItem的索51值可以直接定位HashItem存儲(chǔ)區(qū)中Item位置。HashKey存儲(chǔ)區(qū)用于存儲(chǔ)數(shù)據(jù)(Key),該HashItem存儲(chǔ)區(qū)的大小根據(jù)需要存儲(chǔ)的數(shù)據(jù)的增加而增加。在本發(fā)明實(shí)施例中,根據(jù)HashItem存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)的信息可以直接定位HashKey存儲(chǔ)區(qū)中的位置。在步驟S102中,采用預(yù)設(shè)的哈希函數(shù)(HashFunction)對(duì)需要存儲(chǔ)或者需要讀取的數(shù)據(jù)進(jìn)行計(jì)算,得到哈希值(HashValue),再在HashTable存儲(chǔ)區(qū)中該HashValue直接定位的位置中存儲(chǔ)數(shù)據(jù)信息的索引值,或者從內(nèi)存的對(duì)應(yīng)位置讀取數(shù)據(jù)。在本發(fā)明實(shí)施例中,將內(nèi)存初始化為HashTable存儲(chǔ)區(qū)、HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)后,即可采用預(yù)設(shè)的哈希函數(shù)對(duì)需要存儲(chǔ)或者需要讀取的數(shù)據(jù)進(jìn)行計(jì)算,得到哈希值(HashValue),再在HashTable存儲(chǔ)區(qū)中該HashValue直接定位的位置中存儲(chǔ)數(shù)據(jù)信息的索引值,或者從內(nèi)存的對(duì)應(yīng)位置讀取數(shù)據(jù)。其中存儲(chǔ)數(shù)據(jù)的具體過(guò)程簡(jiǎn)述如下采用預(yù)設(shè)的哈希函數(shù)對(duì)待存儲(chǔ)的數(shù)據(jù)進(jìn)行計(jì)算,得到哈希值;將待存儲(chǔ)的數(shù)據(jù)保存到哈希關(guān)鍵值存儲(chǔ)區(qū),并將待存儲(chǔ)的數(shù)據(jù)在哈希關(guān)鍵值存儲(chǔ)區(qū)的真實(shí)地址和長(zhǎng)度記錄到哈希項(xiàng)存儲(chǔ)區(qū),得到哈希項(xiàng)存儲(chǔ)區(qū)的索引值;_將得到的哈希項(xiàng)存儲(chǔ)區(qū)的索引值記錄在哈希值作為哈希表存儲(chǔ)區(qū)的下標(biāo)直接訪問(wèn)到位置,存入處理完成。讀取數(shù)據(jù)的具體過(guò)程簡(jiǎn)述如下采用預(yù)設(shè)的HashFunction對(duì)數(shù)據(jù)進(jìn)行計(jì)算,得到哈希值(HashValue);根據(jù)該HashValue直接定位HashTable存儲(chǔ)區(qū)中的位置,從而得到HashItem的索引值;根據(jù)HashItem的索引值直接定位HashItem存儲(chǔ)區(qū)中Item位置,從而得到數(shù)據(jù)的信息,該數(shù)據(jù)的信息包括但不限于數(shù)據(jù)的真實(shí)地址和長(zhǎng)度;根據(jù)數(shù)據(jù)的信息直接定位HashKey存儲(chǔ)區(qū)中的位置,從而可以從該位置讀取數(shù)據(jù)。在步驟S103中,判斷是否需要對(duì)哈希表進(jìn)行動(dòng)態(tài)擴(kuò)展處理,如果是,執(zhí)行步驟S104,否則,繼續(xù)判斷。在本發(fā)明實(shí)施例中,可以通過(guò)檢測(cè)哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求來(lái)判斷是否需要對(duì)哈希表進(jìn)行動(dòng)態(tài)擴(kuò)展處理,當(dāng)哈希表不能滿足數(shù)據(jù)存儲(chǔ)需求時(shí),則判定需要對(duì)哈希表進(jìn)行動(dòng)態(tài)擴(kuò)展處理。當(dāng)然還可以采用現(xiàn)有的任意一種判斷方式進(jìn)行判斷,在此不再贅述。其中檢測(cè)哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求的方式可以為檢測(cè)哈希表中的沖突數(shù)量是否大于或者等于1,且需要存儲(chǔ)數(shù)據(jù)的數(shù)量是否大于或者等于HashBase的一半,如果是,則判定哈希表不能滿足數(shù)據(jù)需求。當(dāng)然還可以采用現(xiàn)有的任意一種檢測(cè)方式進(jìn)行檢測(cè),在此不再贅述。在步驟S104中,保持HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)的數(shù)據(jù)不變。在步驟S105中,釋放HashTable存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的HashTable存儲(chǔ)區(qū)。在本發(fā)明實(shí)施例中,由于HashTable存儲(chǔ)區(qū)不能滿足數(shù)據(jù)的存儲(chǔ)需求,因此,在釋放HashTable存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的HashTable存儲(chǔ)區(qū)時(shí),增大HashTable存儲(chǔ)區(qū)的大小HashBase值,以增加HashTable存儲(chǔ)區(qū)的大小,形成新的HashTable存儲(chǔ)區(qū),以使新的HashTable存儲(chǔ)區(qū)能滿足數(shù)據(jù)存儲(chǔ)需求。在本發(fā)明實(shí)施例中,重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的HashTable存儲(chǔ)區(qū)時(shí),可以根據(jù)當(dāng)前待存儲(chǔ)的總的數(shù)據(jù)量設(shè)置HashBase值,HashBase值可以設(shè)置為大于或者等于當(dāng)前待存儲(chǔ)的總的數(shù)據(jù)量的2倍的最小質(zhì)數(shù);也可以是一次性擴(kuò)大到N倍的最小質(zhì)數(shù),其中N為大于或者等于2的自然數(shù),一次性擴(kuò)大多一些,以減少數(shù)據(jù)量需求變大時(shí)的調(diào)整次數(shù)。在步驟S106中,采用上述預(yù)設(shè)的哈希函數(shù)對(duì)HashKey存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的HashTable存儲(chǔ)區(qū)中的數(shù)據(jù)。在本發(fā)明實(shí)施例中,由于新的HashTable存儲(chǔ)區(qū)的大小HashBase值發(fā)生了變化,從而采用上述預(yù)設(shè)的HashFunction對(duì)HashKey存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算后,即可得到新的HashTable存儲(chǔ)區(qū)的數(shù)據(jù),從而通過(guò)僅改變HashKey存儲(chǔ)區(qū)中的數(shù)據(jù)在HashTable存儲(chǔ)區(qū)中的位置,即可不改變哈希表動(dòng)態(tài)擴(kuò)展之前的數(shù)據(jù)的情況下實(shí)現(xiàn)哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù),從而避免了由于HashTable存儲(chǔ)區(qū)過(guò)大導(dǎo)致的內(nèi)存浪費(fèi)問(wèn)題和HashTable存儲(chǔ)區(qū)過(guò)小導(dǎo)致的不能滿足數(shù)據(jù)存儲(chǔ)需求的問(wèn)題。以下以一個(gè)具體的示例對(duì)本發(fā)明實(shí)施例進(jìn)4亍詳細(xì)的描述,但不以該示例為限。假設(shè)將瀏覽器程序中的javascript語(yǔ)句函數(shù)變量作為一種需要存儲(chǔ)的數(shù)據(jù),其中瀏覽器程序中的javascript語(yǔ)句函數(shù)變量如下varvalue—1jfunctionfiml(}{}flmctionfUn2(}{}functionflmX0{}varvalue—2;varvalue一r^先將內(nèi)存初始化為HashTable存儲(chǔ)區(qū)、HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)。并根據(jù)數(shù)據(jù)的存儲(chǔ)需求設(shè)置HashTable存儲(chǔ)區(qū)的大小HashBase值為491。采用預(yù)設(shè)的哈希函數(shù)對(duì)上述數(shù)據(jù)進(jìn)行計(jì)算,得到HashValue,并根據(jù)HashValue將數(shù)據(jù)存儲(chǔ)在內(nèi)存的對(duì)應(yīng)位置或者從內(nèi)存的對(duì)應(yīng)位置讀取數(shù)據(jù),根據(jù)HashValue將數(shù)據(jù)存儲(chǔ)在內(nèi)存的對(duì)應(yīng)位置后,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)如圖2所示。其中HashFunction可以為任意一種哈希函數(shù),如hash—fUn()如下變量,value—1,時(shí),可用內(nèi)碼相加方式(,v,+,a,+T+,u,+,e,+,—,+1+547)%491=138獲得一個(gè)HashValue值138,如采用hash—fim()對(duì)數(shù)據(jù)value—1進(jìn)行計(jì)算,得到數(shù)據(jù)value—1的Hashvalue為138,采用HashFunction對(duì)數(shù)據(jù)funl進(jìn)行計(jì)算,得到數(shù)據(jù)flml的Hashvalue為197,即hash—flin("value—1")=138,hash—fon("flm—1")=197。在得到HashValue后,即可根據(jù)該HashValue得到HashItem的索引值,分別為1和2,根據(jù)HashItem的索引值即可得到HashItem存儲(chǔ)區(qū)中的Item位置,從而得到數(shù)據(jù)value—1的真實(shí)地址和長(zhǎng)度等信息,分別為addr1和addr2,進(jìn)而可以將數(shù)據(jù)value—1寫(xiě)入HashKey存儲(chǔ)區(qū)的真實(shí)地址為addrl中,或者從HashKey存儲(chǔ)區(qū)的真實(shí)地址為addrl中讀取數(shù)據(jù)value—1,將數(shù)據(jù)fUnl寫(xiě)入HashKey存儲(chǔ)區(qū)的真實(shí)地址為addr2中,或者從HashKey存儲(chǔ)區(qū)的真實(shí)地址為addr2中讀取數(shù)據(jù)ftinl,實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和讀取。當(dāng)需要存儲(chǔ)的數(shù)據(jù)動(dòng)態(tài)變化時(shí),為了使哈希表可以滿足數(shù)據(jù)的存儲(chǔ)需求,通過(guò)檢測(cè)當(dāng)前的哈希表是否滿足當(dāng)前數(shù)據(jù)需求來(lái)判斷是否需要對(duì)哈希表進(jìn)行動(dòng)態(tài)擴(kuò)展處理。在本發(fā)明實(shí)施例中,當(dāng)檢測(cè)到哈希表中的沖突數(shù)量大于或者等于l,且Key的數(shù)量大于或者等于HashBase的一半時(shí),則判定需要對(duì)哈希表進(jìn)行動(dòng)態(tài)擴(kuò)展處理。其中對(duì)哈希表進(jìn)行動(dòng)態(tài)擴(kuò)展處理的步驟如下保持HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)不變。釋放HashTable存儲(chǔ)區(qū),并重新分配一塊能滿足當(dāng)前數(shù)據(jù)需求的新的HashTable存儲(chǔ)區(qū)。采用上述預(yù)設(shè)的哈希函數(shù)對(duì)HashKey存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的HashTable存儲(chǔ)區(qū)中的數(shù)據(jù),此時(shí),內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)如圖3所示。由于HashTable的大小HashBase值發(fā)生了變化,因此,采用上述預(yù)設(shè)的哈希函數(shù)對(duì)HashKey存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算后,得到的HashValue不相同,分別為hash—fUn("value—l")=249,hash—fbn("fUn—1")=467,即動(dòng)態(tài)擴(kuò)展HashTable存儲(chǔ)區(qū)得到新的HashTable存儲(chǔ)區(qū)后,動(dòng)態(tài)擴(kuò)展HashTable存儲(chǔ)區(qū)之前的HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)中的數(shù)據(jù)沒(méi)有發(fā)生變化,在原來(lái)的基礎(chǔ)上被繼續(xù)使用,HashKey存儲(chǔ)區(qū)中的數(shù)據(jù)在HashTable存儲(chǔ)區(qū)中的位置發(fā)生改變。這樣使得HashTable存儲(chǔ)區(qū)可以動(dòng)態(tài)的適應(yīng)數(shù)據(jù),避免了由于HashTable存儲(chǔ)區(qū)過(guò)大導(dǎo)致的內(nèi)存浪費(fèi)問(wèn)題和HashTable存儲(chǔ)區(qū)過(guò)小導(dǎo)致的不能滿足數(shù)據(jù)存儲(chǔ)需求的問(wèn)題。以下以一個(gè)具體的示例對(duì)本發(fā)明實(shí)施例進(jìn)行詳細(xì)的描述,但不以該示例為限。假設(shè)學(xué)校有500學(xué)生,學(xué)生的信息數(shù)據(jù)要記錄下來(lái),以方便查找學(xué)生信息。其中學(xué)生信息包括但不限于學(xué)生姓名和每個(gè)學(xué)生的家長(zhǎng)、年齡、身高,出生年月等建檔學(xué)生信息。才艮據(jù)此數(shù)據(jù)存儲(chǔ)需求,HashTable的大小HashBase值設(shè)置為大于或者等于1000(2倍數(shù)據(jù)量)的最小質(zhì)數(shù),為1009。且預(yù)設(shè)的哈希函數(shù)如下將學(xué)生姓名的總筆劃數(shù)、字?jǐn)?shù)組合成一個(gè)數(shù)再加上13后與HashBase值的余數(shù)。那么將學(xué)生的信息數(shù)據(jù)存儲(chǔ)至內(nèi)存的過(guò)程如下先采用預(yù)設(shè)的哈希函數(shù)對(duì)學(xué)生的信息數(shù)據(jù)進(jìn)行計(jì)算,得到HashValue,如采用預(yù)設(shè)的哈希函數(shù)對(duì)學(xué)生張三的信息數(shù)據(jù)進(jìn)行計(jì)算,得到其HashValue為4,將該學(xué)生張三的信息數(shù)據(jù)存儲(chǔ)至哈希關(guān)鍵值存儲(chǔ)區(qū),并把保存學(xué)生張三的信息數(shù)據(jù)的地址和此數(shù)據(jù)長(zhǎng)度記錄到哈希項(xiàng)存儲(chǔ)區(qū),得到一個(gè)哈希項(xiàng)存儲(chǔ)區(qū)的索引值。將得到的哈希項(xiàng)存儲(chǔ)區(qū)的索引值存儲(chǔ)至之前計(jì)算得到的哈希值直接定位到的HashTable存儲(chǔ)區(qū)的位置。根據(jù)上述方法,將所有500名建檔學(xué)生信息保存HashKey存儲(chǔ)區(qū)中,HashItem存儲(chǔ)區(qū)中存放有500個(gè)地址和長(zhǎng)度信息,長(zhǎng)度為1009的Hashtable存儲(chǔ)區(qū)中散亂的存放著1-500個(gè)HashItem的素引值。查找學(xué)生張三的過(guò)程如下根據(jù)名字張三和HashBase值1009采用預(yù)設(shè)的哈希函數(shù)計(jì)算得到HashValue為4,(存入時(shí),也是4),則根據(jù)Hashtable存儲(chǔ)區(qū)中第4個(gè)位置記錄的HashItem的索引值即可查找到學(xué)生張三的信息數(shù)據(jù)的存儲(chǔ)地址和長(zhǎng)度等信息,從而可從HashKey存儲(chǔ)區(qū)中查找到學(xué)生張三的信息數(shù)據(jù)。突然學(xué)校又增加了100名學(xué)生,此時(shí),首先判斷Hashtable存儲(chǔ)區(qū)中的沖突數(shù)量大于1,并且學(xué)生數(shù)量變?yōu)?00>HashBase值1009的一半,則需要?jiǎng)討B(tài)擴(kuò)展HashTable存儲(chǔ)區(qū)。根據(jù)新的學(xué)生量,重新分配新的HashTable存儲(chǔ)區(qū),設(shè)置新的HashTkble存儲(chǔ)區(qū)的大小為新的學(xué)生量的2倍以上的最小質(zhì)數(shù)1103,即設(shè)置新的HashTable值為1103釋放原來(lái)的HashTable存儲(chǔ)區(qū)1009空間,新建立HashTable存儲(chǔ)區(qū)1103空間,原有的HashItem存儲(chǔ)區(qū)與HashKey存儲(chǔ)區(qū)不變,只是增加新的100學(xué)生數(shù)據(jù),并相互關(guān)耳關(guān)。運(yùn)用上述預(yù)設(shè)的哈希函數(shù)計(jì)算出HashKey存儲(chǔ)區(qū)中每個(gè)學(xué)生的HashValue以及新增加的每個(gè)學(xué)生的HashValue,并在相應(yīng)的HashTable存儲(chǔ)區(qū)位置記錄每個(gè)學(xué)生的Hashltem的素引值。此時(shí)HashKey數(shù)據(jù)區(qū)中之前的學(xué)生數(shù)據(jù)不變,增加100名學(xué)生數(shù)據(jù),HashItem變?yōu)?00個(gè)Item,HashTable變?yōu)?103個(gè)位置。圖4示出了本發(fā)明實(shí)施例提供的哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的裝置的結(jié)構(gòu),為了便于說(shuō)明,僅示出了與本發(fā)明實(shí)施例相關(guān)的部分。該哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的裝置可以是內(nèi)置于具有內(nèi)存應(yīng)用的電子設(shè)備中的軟件單元、硬件單元或者軟硬件相結(jié)合的單元,或者作為獨(dú)立的掛件集成到具有內(nèi)存應(yīng)用的電子設(shè)備中。其中.'內(nèi)存初始化單元41將內(nèi)存初始化為HashTable存儲(chǔ)區(qū)、HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)。其中HashTable用于存儲(chǔ)哈希項(xiàng)的索引值(HashItem的索引值)。HashItem存儲(chǔ)區(qū)用于存儲(chǔ)數(shù)據(jù)的信息。其中數(shù)據(jù)的信息包括但不限于數(shù)據(jù)的真實(shí)地址和長(zhǎng)度。HashKey存儲(chǔ)區(qū)用于存儲(chǔ)數(shù)據(jù)(Key)。數(shù)據(jù)處理單元42采用預(yù)設(shè)的哈希函數(shù)(HashFunction)對(duì)需要存儲(chǔ)或者需要讀取的數(shù)據(jù)進(jìn)行計(jì)算,得到哈希值(HashValue),再在HashTable存儲(chǔ)區(qū)中該HashValue直接定位的位置中存儲(chǔ)數(shù)據(jù)信息的索引值,或者從內(nèi)存的對(duì)應(yīng)位置讀取lt據(jù)。其具體處理過(guò)程如上所述,在此不再贅述。哈希表判斷單元43判斷哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求。在本發(fā)明實(shí)施例中,當(dāng)哈希表不能滿足數(shù)據(jù)存儲(chǔ)需求時(shí),則判定需要對(duì)哈希表進(jìn)行動(dòng)態(tài)擴(kuò)展處理。其中判斷哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求的方式可以為檢測(cè)哈希表中的沖突數(shù)量是否大于或者等于1,且需要存儲(chǔ)的數(shù)據(jù)的數(shù)量是否大于或者等于HashBase的一半,如果是,則判定哈希表不能滿足數(shù)據(jù)存儲(chǔ)需求。當(dāng)然還可以采用現(xiàn)有的任意一種檢測(cè)方式進(jìn)行檢測(cè),在此不再贅述。存儲(chǔ)區(qū)保持單元44在哈希表判斷單元43的結(jié)果為否時(shí),保持HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)的數(shù)據(jù)不變。哈希表重新分配單元45在哈希表判斷單元43的結(jié)果為否時(shí),釋放HashTable存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的HashTable存儲(chǔ)區(qū)。在本發(fā)明實(shí)施例中,重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的HashTable存儲(chǔ)區(qū)時(shí),可以根據(jù)當(dāng)前待存儲(chǔ)的總的數(shù)據(jù)量設(shè)置HashBase值,HashBase值可以設(shè)置為大于或者等于當(dāng)前待存儲(chǔ)的總的數(shù)據(jù)量的2倍的最小質(zhì)數(shù);也可以是一次性擴(kuò)大到N倍的最小質(zhì)數(shù),所述N為大于或者等于2的自然數(shù),一次性擴(kuò)大多一些,以減少數(shù)據(jù)量需求變大時(shí)的調(diào)整次數(shù)。數(shù)據(jù)重計(jì)算單元46在哈希表判斷單元43的結(jié)果為否時(shí),采用上述預(yù)設(shè)的HashFunction對(duì)HashKey存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的HashTable存儲(chǔ)區(qū)中的數(shù)據(jù)。在本發(fā)明實(shí)施例中,當(dāng)哈希表不能滿足數(shù)據(jù)存儲(chǔ)需求時(shí),先保持HashItem存儲(chǔ)區(qū)和HashKey存儲(chǔ)區(qū)的數(shù)據(jù)不變,釋放HashTable存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的HashTable存儲(chǔ)區(qū),采用預(yù)設(shè)的哈希函數(shù)對(duì)HashKey存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的HashTable存儲(chǔ)區(qū)的數(shù)據(jù),從而使哈希表可以動(dòng)態(tài)的適應(yīng)任意數(shù)據(jù),避免了由于HashTable存儲(chǔ)區(qū)過(guò)大造成的內(nèi)存浪費(fèi)和HashTable存儲(chǔ)區(qū)過(guò)小造成的HashTable存儲(chǔ)區(qū)不能滿足任意數(shù)據(jù)需求。-以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1、一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的方法,其特征在于,所述方法包括下述步驟A、將內(nèi)存初始化為哈希表存儲(chǔ)區(qū)、哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū);B、當(dāng)檢測(cè)到哈希表不能滿足數(shù)據(jù)的存儲(chǔ)需求時(shí),保持哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū)的數(shù)據(jù)不變,釋放哈希表存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū),采用重新分配哈希表存儲(chǔ)區(qū)之前采用的哈希函數(shù)對(duì)哈希關(guān)鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的哈希表存儲(chǔ)區(qū)中的數(shù)據(jù)。2、如權(quán)利要求1所述的方法,其特征在于,在所述步驟B之前,所述方法還包括下述步驟檢測(cè)哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求;所述檢測(cè)哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求的方式為檢測(cè)哈希表中的沖突數(shù)量是否大于或者等于1,且需要存儲(chǔ)的數(shù)據(jù)的數(shù)量是否大于或者等于哈希表的大小的一半,如果是,則判定哈希表不能滿足數(shù)據(jù)存儲(chǔ)需求。3、如權(quán)利要求1所述的方法,其特征在于,在所述步驟B之前,所述方法還包括采用預(yù)設(shè)的哈希函數(shù)對(duì)待存儲(chǔ)的數(shù)據(jù)進(jìn)行計(jì)算,得到哈希值;將待存儲(chǔ)的數(shù)據(jù)保存到哈希關(guān)鍵值存儲(chǔ)區(qū),并將數(shù)據(jù)的信息記錄到哈希項(xiàng)存儲(chǔ)區(qū),得到哈希項(xiàng)存儲(chǔ)區(qū)的索引值,所述數(shù)據(jù)的信息為待存儲(chǔ)的數(shù)據(jù)在哈希關(guān)鍵值存儲(chǔ)區(qū)的真實(shí)地址和長(zhǎng)度;將得到的哈希項(xiàng)存儲(chǔ)區(qū)的索引值記錄在哈希值作為哈希表存儲(chǔ)區(qū)的下標(biāo)直接訪問(wèn)到的位置。4、如權(quán)利要求1至3任一權(quán)利要求所述的方法,其特征在于,在重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū)時(shí),設(shè)置所述新的哈希表存儲(chǔ)區(qū)的大小為大于或者等于當(dāng)前待存儲(chǔ)的總的數(shù)據(jù)量的N倍的最小質(zhì)數(shù),所述N為大于或者等于2的自然數(shù)。5、一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的裝置,其特征在于,所述裝置包括內(nèi)存初始化單元,用于將內(nèi)存初始化為哈希表存儲(chǔ)區(qū)、哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū);哈希表判斷單元,用于判斷哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求;存儲(chǔ)區(qū)保持單元,用于在所述哈希表判斷單元的結(jié)果為否時(shí),保持哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū)的數(shù)據(jù)不變;哈希表重新分配單元,用于在所述哈希表判斷單元的結(jié)果為否時(shí),釋放哈希表存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū);數(shù)據(jù)重計(jì)算單元,用于在所述哈希表判斷單元的結(jié)果為否時(shí),采用重新分配哈希表存儲(chǔ)區(qū)之前采用的哈希函數(shù)對(duì)哈希關(guān)鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的哈希表存儲(chǔ)區(qū)中的數(shù)據(jù)。6、如權(quán)利要求5所述的裝置,其特征在于,所述哈希表判斷單元檢測(cè)哈希表是否滿足數(shù)據(jù)存儲(chǔ)需求的方式為檢測(cè)哈希表中的沖突數(shù)量是否大于或者等于1,且需要存儲(chǔ)的數(shù)據(jù)的數(shù)量是否大于或者等于哈希表的大小的一半,如果是,則判定哈希表不能滿足數(shù)據(jù)存儲(chǔ)需求。7、如權(quán)利要求5所述的裝置,其特征在于,所述裝置還包括數(shù)據(jù)處理單元,用于采用預(yù)設(shè)的哈希函數(shù)對(duì)需要存儲(chǔ)或者需要讀取的數(shù)據(jù)進(jìn)行計(jì)算,得到哈希值,再在哈希表存儲(chǔ)區(qū)中所述哈希值直接定位的位置中存儲(chǔ)數(shù)據(jù)的信息的索引值,或者從內(nèi)存的對(duì)應(yīng)位置讀取數(shù)據(jù),所述數(shù)據(jù)的信息包括數(shù)據(jù)的真實(shí)地址和長(zhǎng)度。8、如權(quán)利要求5至7任一權(quán)利要求所述的裝置,其特征在于,在重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū)時(shí),設(shè)置所述新的哈希表存儲(chǔ)區(qū)的大小為大于或者等于當(dāng)前待存儲(chǔ)的總的數(shù)據(jù)量的N倍的最小質(zhì)數(shù),所述N為大于或者等于2的自然數(shù)。全文摘要本發(fā)明適用于數(shù)據(jù)存儲(chǔ)領(lǐng)域,提供了一種哈希表動(dòng)態(tài)適應(yīng)數(shù)據(jù)的方法和裝置,所述方法包括下述步驟A.將內(nèi)存初始化為哈希表存儲(chǔ)區(qū)、哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū);B.當(dāng)檢測(cè)到哈希表不能滿足數(shù)據(jù)的存儲(chǔ)需求時(shí),保持哈希項(xiàng)存儲(chǔ)區(qū)和哈希關(guān)鍵值存儲(chǔ)區(qū)的數(shù)據(jù)不變,釋放哈希表存儲(chǔ)區(qū),并重新分配能滿足數(shù)據(jù)存儲(chǔ)需求的新的哈希表存儲(chǔ)區(qū),采用重新分配哈希表存儲(chǔ)區(qū)之前采用的哈希函數(shù)對(duì)哈希關(guān)鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)重新進(jìn)行計(jì)算,得到新的哈希表存儲(chǔ)區(qū)中的數(shù)據(jù)。本發(fā)明實(shí)施例使哈希表可以動(dòng)態(tài)的適應(yīng)任意數(shù)據(jù),避免了由于哈希表存儲(chǔ)區(qū)過(guò)大造成的內(nèi)存浪費(fèi)和哈希表存儲(chǔ)區(qū)過(guò)小造成的哈希表存儲(chǔ)區(qū)不能滿足任意數(shù)據(jù)需求的問(wèn)題。文檔編號(hào)G06F17/30GK101582082SQ200910108308公開(kāi)日2009年11月18日申請(qǐng)日期2009年6月16日優(yōu)先權(quán)日2009年6月16日發(fā)明者徐佳宏,程伯欽,頒蔣申請(qǐng)人:深圳市茁壯網(wǎng)絡(luò)股份有限公司