本發(fā)明涉及一種NOR-Flash哈希表存儲(chǔ)方法及裝置,屬于數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域。
背景技術(shù):
單片機(jī)中NOR-FLASH作為外部存儲(chǔ)已經(jīng)成為標(biāo)準(zhǔn),NOR-FLASH擁有無壞塊、擦除單元小、數(shù)據(jù)寫入錯(cuò)誤率低、允許單字節(jié)讀取等優(yōu)勢(shì)。但是由于成本限制,無法使用操作系統(tǒng)來管理,因此會(huì)遇到以下問題:
1、數(shù)據(jù)必須分塊存儲(chǔ)
由于單片機(jī)等設(shè)備沒有操作系統(tǒng),無法動(dòng)態(tài)分配空間,內(nèi)存也只有幾十KB,也無法引入空間管理算法,在空間使用上必須采用先劃分后使用的辦法。比如:對(duì)檔案劃出一塊區(qū)域,每條檔案固定長(zhǎng)度50字節(jié),1M只能存儲(chǔ)20971條檔案。每個(gè)檔案又要關(guān)聯(lián)到規(guī)則組合,每個(gè)規(guī)則段大約70字節(jié),1M只能存儲(chǔ)14979條。
2、空間無法進(jìn)行混合使用
由于內(nèi)容的分塊,每塊數(shù)據(jù)都要分開保存,假如每個(gè)人都用同一種規(guī)則,那么系統(tǒng)最多就是2萬檔案。規(guī)則只保存了一條70字節(jié),1MB的空間就這么浪費(fèi)了。或者說一個(gè)人使用兩條規(guī)則,那么系統(tǒng)最多是7489個(gè)人,檔案的一大半空間又浪費(fèi)了。
3、數(shù)據(jù)刪除后無法利用刪除的空間
由于Flash特性,讀寫可以單次寫,寫過的地方不能再次寫入只能擦除,但是擦除必須一次性擦掉一塊(一般大于64KB),由于單片機(jī)只有幾十KB內(nèi)存,根本沒有辦法做數(shù)據(jù)緩存,而且緩存過程中還可能產(chǎn)生斷電,因此,更加不安全。使用其他臨時(shí)塊搬移需要讀寫2次,擦除2次,效率更低。
4、數(shù)據(jù)查詢只能從頭查詢
由于空間是順序存放,取出某條檔案或者某條規(guī)則必須要從頭遍歷,別無他法。當(dāng)檔案很多的時(shí)候檢索效率極低。
Hash算法是一種散列算法,通過摘要方式將數(shù)據(jù)分組,通過表掛載到不同的鏈上。這樣就實(shí)現(xiàn)了初步的hash算法結(jié)構(gòu)。
由于Hash使用鏈?zhǔn)酱鎯?chǔ),每條鏈?zhǔn)菃为?dú)標(biāo)號(hào),這樣可以將某些業(yè)務(wù)集中放在某個(gè)或某幾個(gè)鏈上,實(shí)現(xiàn)多業(yè)務(wù)數(shù)據(jù)存放,比如將檔案放在0-99鏈、黑名單放在100-149鏈上、配置信息放在150鏈上。數(shù)據(jù)之間無干擾,而且根據(jù)數(shù)據(jù)的摘要也能快速檢索數(shù)據(jù)。但是該算法只能在內(nèi)存中使用,用類似malloc()和free()的方式進(jìn)行,而Flash中沒有這樣的東西,而且只能從1寫0,擦除又要64K一塊。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明針對(duì)以上問題,提供一種NOR-Flash哈希表存儲(chǔ)方法及裝置,將Hash算法結(jié)構(gòu)進(jìn)行轉(zhuǎn)換,并運(yùn)用到NOR-Flash芯片結(jié)構(gòu)中,從而節(jié)約存儲(chǔ)空間,提高信息檢索效率。
本發(fā)明解決上述技術(shù)問題的技術(shù)方案如下:一種NOR-Flash哈希表存儲(chǔ)方法,該方法包括如下步驟:
步驟一:建立鏈表頭數(shù)組,存儲(chǔ)每一條哈希鏈的頭部;
步驟二:定義哈希鏈表的基本數(shù)據(jù)源格式;
步驟三:掃描用戶第一次開機(jī)時(shí)Flash芯片中的數(shù)據(jù),構(gòu)建鏈表基礎(chǔ)數(shù)據(jù);
步驟四:按順序直接存放用戶添加的數(shù)據(jù),將下一元素地址作為內(nèi)存中的鏈表頭,添加完后新的鏈表頭作為新的元素地址;
步驟五:當(dāng)空間剩余1個(gè)塊即最小擦除單元時(shí),回收作業(yè)把鏈表前面的數(shù)據(jù)進(jìn)行刪除,并掛載到鏈表后面,當(dāng)騰出一個(gè)塊的垃圾數(shù)據(jù)時(shí),將單塊的垃圾數(shù)據(jù)擦除。
進(jìn)一步的,步驟一中所述的建立鏈表頭數(shù)組具體包括:采用預(yù)設(shè)的哈希函數(shù)構(gòu)建鏈表號(hào)、鏈表塊頭、鏈表塊尾、鏈表起始位置。
進(jìn)一步的,步驟二中所述的哈希鏈表的基本數(shù)據(jù)源格式至少包括可用標(biāo)記、摘要、下一元素地址、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)、循環(huán)冗余校驗(yàn)碼中的一項(xiàng)。
進(jìn)一步的,步驟三中所述的構(gòu)建鏈表基礎(chǔ)數(shù)據(jù)包括鏈表空白尾地址、有效記錄數(shù)、無效記錄數(shù)。
進(jìn)一步的,所述步驟五中鏈表數(shù)據(jù)的刪除、掛載、擦除具體指:
將有效元素轉(zhuǎn)移到已擦除的空白區(qū)域;
騰出一塊完整的標(biāo)記無效的區(qū)域;
將無效區(qū)域進(jìn)行塊擦除變?yōu)榭瞻讌^(qū)域。
本發(fā)明還提供一種NOR-Flash哈希表存儲(chǔ)裝置,所述裝置包括:
鏈表構(gòu)建模塊,用于建立鏈表頭數(shù)組,存儲(chǔ)每一條哈希鏈的頭部,同時(shí)掃描用戶第一次開機(jī)時(shí)Flash芯片中的數(shù)據(jù),構(gòu)建鏈表基礎(chǔ)數(shù)據(jù);
格式定義模塊,用于定義哈希鏈表的基本數(shù)據(jù)源格式;
數(shù)據(jù)存儲(chǔ)模塊,用于存放用戶添加的數(shù)據(jù);
數(shù)據(jù)整理模塊,用于當(dāng)空間剩余1個(gè)塊即最小擦除單元時(shí),對(duì)鏈表前面的數(shù)據(jù)進(jìn)行刪除、掛載、擦除。
進(jìn)一步的,所述格式定義模塊中基本數(shù)據(jù)源格式至少包括可用標(biāo)記、摘要、下一元素地址、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)、循環(huán)冗余校驗(yàn)碼中的一項(xiàng)。
進(jìn)一步的,所述數(shù)據(jù)存儲(chǔ)模塊存儲(chǔ)的數(shù)據(jù)將下一元素地址作為內(nèi)存中的鏈表頭,添加完后新的鏈表頭作為新的元素地址。
進(jìn)一步的,所述數(shù)據(jù)整理模塊具體包括數(shù)據(jù)刪除子模塊、數(shù)據(jù)掛載子模塊、數(shù)據(jù)擦除子模塊:
數(shù)據(jù)刪除子模塊,用于當(dāng)存儲(chǔ)空間剩余最小擦除單元時(shí),對(duì)鏈表前面的數(shù)據(jù)進(jìn)行刪除;
數(shù)據(jù)掛載子模塊,用于當(dāng)存儲(chǔ)空間剩余最小擦除單元時(shí),將鏈表前面刪除的數(shù)據(jù),掛載到鏈表后面;
數(shù)據(jù)擦除子模塊,用于當(dāng)騰出垃圾數(shù)據(jù)占據(jù)一個(gè)塊時(shí),將單塊的垃圾數(shù)據(jù)擦除。
本發(fā)明的有益效果是:通過對(duì)Hash算法結(jié)構(gòu)進(jìn)行轉(zhuǎn)換以及鏈表數(shù)據(jù)的構(gòu)造及清理,從而實(shí)現(xiàn)存儲(chǔ)空間混合使用,并可利用刪除后的空間,有效的提高信息檢索效率,節(jié)約存儲(chǔ)空間。
附圖說明
圖1為本發(fā)明實(shí)施例中NOR-Flash哈希表存儲(chǔ)方法實(shí)現(xiàn)流程圖;
圖2為本發(fā)明實(shí)施例中NOR-Flash哈希表存儲(chǔ)方法中數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)示意圖;
圖3為本發(fā)明實(shí)施例中哈希鏈表數(shù)據(jù)源格式構(gòu)成示意圖;
圖4為本發(fā)明實(shí)施例中哈希鏈表數(shù)據(jù)整理流程示意圖;
圖5為本發(fā)明實(shí)施例中NOR-Flash哈希表存儲(chǔ)裝置結(jié)構(gòu)框圖。
具體實(shí)施方式
以下結(jié)合附圖對(duì)本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。
圖1為NOR-Flash哈希表存儲(chǔ)方法實(shí)現(xiàn)流程圖,該方法包括如下步驟:
S1:建立鏈表頭數(shù)組,存儲(chǔ)每一條哈希鏈的頭部;
S2:定義哈希鏈表的基本數(shù)據(jù)源格式;
S3:掃描用戶第一次開機(jī)時(shí)Flash芯片中的數(shù)據(jù),構(gòu)建鏈表基礎(chǔ)數(shù)據(jù);
S4:按順序直接存放用戶添加的數(shù)據(jù),將下一元素地址作為內(nèi)存中的鏈表頭,添加完后新的鏈表頭作為新的元素地址;
S5:當(dāng)空間剩余1個(gè)塊即最小擦除單元時(shí),回收作業(yè)把鏈表前面的數(shù)據(jù)進(jìn)行刪除,并掛載到鏈表后面,當(dāng)騰出一個(gè)塊的垃圾數(shù)據(jù)時(shí),將單塊的垃圾數(shù)據(jù)擦除。
其中,S1中建立鏈表頭數(shù)組具體包括:采用預(yù)設(shè)的哈希函數(shù)構(gòu)建鏈表號(hào)、鏈表塊頭、鏈表塊尾、鏈表起始位置。
如圖2所示為NOR-Flash哈希表存儲(chǔ)方法中數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)示意圖,按順序直接存放用戶添加的數(shù)據(jù),將下一元素地址作為內(nèi)存中的鏈表頭,添加完后新的鏈表頭作為新的元素地址。
如圖3所示,S2中哈希鏈表的基本數(shù)據(jù)源格式包括可用標(biāo)記、摘要、下一元素地址、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)、循環(huán)冗余校驗(yàn)碼。
S3中構(gòu)建鏈表基礎(chǔ)數(shù)據(jù)包括鏈表空白尾地址、有效記錄數(shù)、無效記錄數(shù)。
如圖4所示,S5中鏈表數(shù)據(jù)的刪除、掛載、擦除具體指:
將有效元素轉(zhuǎn)移到已擦除的空白區(qū)域;
騰出一塊完整的標(biāo)記無效的區(qū)域;
將無效區(qū)域進(jìn)行塊擦除變?yōu)榭瞻讌^(qū)域。
NOR-Flash哈希表存儲(chǔ)方法涉及的函數(shù)語句如下:
Struct jhash_info{
Ju32 j_hash_head[256];
Ju8 j_hash_n;
Ju32 j_hash_gf_start;
Ju32 j_hash_gf_end;
Ju32 j_hash_start_addr;
Ju32 j_hash_head[256];
Ju32 j_hash_btaddr;
Ju32 j_hash_good;
Ju32 j_hash_bad;
Ju32 jednsaddr;
Ju16 jzlkn;
Ju8 jfastaddmod;
Ju8 jhash_chave_clean;
Ju8 jhash_cing_clean;
};
如圖5所示,本發(fā)明還提供一種NOR-Flash哈希表存儲(chǔ)裝置,該裝置包括:
鏈表構(gòu)建模塊1用于建立鏈表頭數(shù)組,存儲(chǔ)每一條哈希鏈的頭部,同時(shí)掃描用戶第一次開機(jī)時(shí)Flash芯片中的數(shù)據(jù),構(gòu)建鏈表基礎(chǔ)數(shù)據(jù)。
格式定義模塊2用于定義哈希鏈表的基本數(shù)據(jù)源格式,格式定義模塊2中基本數(shù)據(jù)源格式包括可用標(biāo)記、摘要、下一元素地址、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)、循環(huán)冗余校驗(yàn)碼。
數(shù)據(jù)存儲(chǔ)模塊3用于存放用戶添加的數(shù)據(jù),數(shù)據(jù)存儲(chǔ)模塊存儲(chǔ)的數(shù)據(jù)將下一元素地址作為內(nèi)存中的鏈表頭,添加完后新的鏈表頭作為新的元素地址。
數(shù)據(jù)整理模塊4用于當(dāng)空間剩余1個(gè)塊即最小擦除單元時(shí),對(duì)鏈表前面的數(shù)據(jù)進(jìn)行刪除、掛載、擦除。數(shù)據(jù)整理模塊4具體包括數(shù)據(jù)刪除子模塊401、數(shù)據(jù)掛載子模塊402、數(shù)據(jù)擦除子模塊403,其中,數(shù)據(jù)刪除子模塊401用于當(dāng)存儲(chǔ)空間剩余最小擦除單元時(shí),對(duì)鏈表前面的數(shù)據(jù)進(jìn)行刪除;數(shù)據(jù)掛載子模塊402用于當(dāng)存儲(chǔ)空間剩余最小擦除單元時(shí),將鏈表前面刪除的數(shù)據(jù),掛載到鏈表后面,數(shù)據(jù)擦除子模塊403用于當(dāng)騰出垃圾數(shù)據(jù)占據(jù)一個(gè)塊時(shí),將單塊的垃圾數(shù)據(jù)擦除。
以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。