一、哈希值有什么用
哈希值,即HASH值,是通過(guò)對(duì)文件內(nèi)容進(jìn)行加密運(yùn)算得到的一組二進(jìn)制值,主要用途是用于文件校驗(yàn)或簽名。正是因?yàn)檫@樣的特點(diǎn),它常常用來(lái)判斷兩個(gè)文件是否相同。
比如,從網(wǎng)絡(luò)上下載某個(gè)文件,只要把這個(gè)文件原來(lái)的哈希值同下載后得到的文件的哈希值進(jìn)行對(duì)比,如果相同,則表示兩個(gè)文件完全一致,下載過(guò)程沒(méi)有損壞文件。而如果不一致,則表明下載得到的文件跟原來(lái)的文件不同,文件在下載過(guò)程中受到了損壞。
哈希值又稱(chēng)散列函數(shù),是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。
散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來(lái)。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個(gè)叫做散列值的指紋。
散列值通常用一個(gè)短的隨機(jī)字母和數(shù)字組成的字符串來(lái)代表。好的散列函數(shù)在輸入域中很少出現(xiàn)散列沖突。在散列表和數(shù)據(jù)處理中,不抑制沖突來(lái)區(qū)別數(shù)據(jù),會(huì)使得數(shù)據(jù)庫(kù)記錄更難找到。哈希算法將任意長(zhǎng)度的二進(jìn)制值映射為固定長(zhǎng)度的較小二進(jìn)制值,這個(gè)小的二進(jìn)制值稱(chēng)為哈希值。哈希值是一段數(shù)據(jù)少數(shù)且極其緊湊的數(shù)值表示形式。如果散列一段明文而且哪怕只更改該段落的一個(gè)字母,隨后的哈希都將產(chǎn)生不同的值。要找到散列為同一個(gè)值的兩個(gè)不同的輸入,在計(jì)算上是不可能的。 消息身份驗(yàn)證代碼 (MAC) 哈希函數(shù)通常與數(shù)字簽名一起用于對(duì)數(shù)據(jù)進(jìn)行簽名,而消息檢測(cè)代碼 (MDC) 哈希函數(shù)則用于數(shù)據(jù)完整性。
延伸閱讀:
二、常用HASH函數(shù)
散列函數(shù)能使對(duì)一個(gè)數(shù)據(jù)序列的訪問(wèn)過(guò)程更加迅速有效,通過(guò)散列函數(shù),數(shù)據(jù)元素將被更快地定位。常用Hash函數(shù)有:
1.直接尋址法。取關(guān)鍵字或關(guān)鍵字的某個(gè)線性函數(shù)值為散列地址。即H(key)=key或H(key) = a·key + b,其中a和b為常數(shù)(這種散列函數(shù)叫做自身函數(shù))
2.?dāng)?shù)字分析法。分析一組數(shù)據(jù),比如一組員工的出生年月日,這時(shí)我們發(fā)現(xiàn)出生年月日的前幾位數(shù)字大體相同,這樣的話(huà),出現(xiàn)沖突的幾率就會(huì)很大,但是我們發(fā)現(xiàn)年月日的后幾位表示月份和具體日期的數(shù)字差別很大,如果用后面的數(shù)字來(lái)構(gòu)成散列地址,則沖突的幾率會(huì)明顯降低。因此數(shù)字分析法就是找出數(shù)字的規(guī)律,盡可能利用這些數(shù)據(jù)來(lái)構(gòu)造沖突幾率較低的散列地址。
3.平方取中法。取關(guān)鍵字平方后的中間幾位作為散列地址。
4.折疊法。將關(guān)鍵字分割成位數(shù)相同的幾部分,最后一部分位數(shù)可以不同,然后取這幾部分的疊加和(去除進(jìn)位)作為散列地址。
5.隨機(jī)數(shù)法。選擇一隨機(jī)函數(shù),取關(guān)鍵字作為隨機(jī)函數(shù)的種子生成隨機(jī)值作為散列地址,通常用于關(guān)鍵字長(zhǎng)度不同的場(chǎng)合。
6.除留余數(shù)法。取關(guān)鍵字被某個(gè)不大于散列表表長(zhǎng)m的數(shù)p除后所得的余數(shù)為散列地址。即 H(key) = key MOD p,p<=m。不僅可以對(duì)關(guān)鍵字直接取模,也可在折疊、平方取中等運(yùn)算之后取模。對(duì)p的選擇很重要,一般取素?cái)?shù)或m,若p選的不好,容易產(chǎn)生碰撞。