hash算法和常见的hash函数 [转]
生活随笔
收集整理的這篇文章主要介紹了
hash算法和常见的hash函数 [转]
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Hash,就是把任意長度的輸入,通過散列算法,變換成固定長度的輸出,該輸出就是散列值。
這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能
會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。數(shù)學表述為:h = H(M) ,
其中H( )--單向散列函數(shù),M--任意長度明文,h--固定長度散列值。
在信息安全領(lǐng)域中應用的Hash算法,還需要滿足其他關(guān)鍵特性:
第一當然是單向性(one-way),從預映射,能夠簡單迅速的得到散列值,而在計算上不可能構(gòu)造一個預映
射,使其散列結(jié)果等于某個特定的散列值,即構(gòu)造相應的M=H-1(h)不可行。這樣,散列值就能在統(tǒng)計上唯一的
表征輸入值,因此,密碼學上的 Hash 又被稱為"消息摘要(messagedigest)",就是要求能方便的將"消息"進
行"摘要",但在"摘要"中無法得到比"摘要"本身更多的關(guān)于"消息"的信息。
第二是抗沖突性(collision-resistant),即在統(tǒng)計上無法產(chǎn)生2個散列值相同的預映射。給定M,計算上
無法找到M',滿足H(M)=H(M') ,此謂弱抗沖突性;計算上也難以尋找一對任意的M和M',使?jié)M足H(M)=H(M')
,此謂強抗沖突性。要求"強抗沖突性"主要是為了防范 所謂"生日攻擊(birthdayattack)",在一個10人的團
體中,你能找到和你生日相同的人的概率是2.4%,而在同一團體中,有2人生日相同的概率是11.7%。類似的,
當預映射的空間很大的情況下,算法必須有足夠的強度來保證不能輕易找到"相同生日"的人。 第三是映射分布均勻性和差分分布均勻性,散列結(jié)果中,為 0 的 bit 和為 1 的 bit ,其總數(shù)應該大致
相等;輸入中一個 bit的變化,散列結(jié)果中將有一半以上的 bit 改變,這又叫做"雪崩效應(avalanche effect)";
要實現(xiàn)使散列結(jié)果中出現(xiàn) 1bit的變化,則輸入中至少有一半以上的 bit 必須發(fā)生變化。其實質(zhì)是必須使輸入
中每一個 bit 的信息, 盡量均勻的反映到輸出的每一個 bit上去;輸出中的每一個 bit,都是輸入中盡可能
多 bit 的信息一起作用的結(jié)果。Damgard 和 Merkle定義了所謂“壓縮函數(shù)(compression function)”,就是
將一個固定長度輸入,變換成較短的固定長度的輸出,這對密碼學實踐上Hash函數(shù)的設計產(chǎn)生了很大的影響。
Hash函數(shù)就是被設計為基于通過特定壓縮函數(shù)的不斷重復“壓縮”輸入的分組和前一次壓縮處理的結(jié)果的過程,
直到整個消息都被壓縮完畢,最后的輸出作為整個消息的散列值。盡管還缺乏嚴格的證明,但絕大多數(shù)業(yè)界的
研究者都同意,如果壓縮函數(shù)是安全的,那么以上述形式散列任意長度的消息也將是安全的。任意長度的消息
被分拆成符合壓縮函數(shù)輸入要求的分組,最后一個分組可能需要在末尾添上特定的填充字節(jié),這些分組將被順
序處理,除了第一個消息分組將與散列初始化值一起作為壓縮函數(shù)的輸入外,當前分組將和前一個分組的壓縮
函數(shù)輸出一起被作為這一次壓縮的輸入,而其輸出又將被作為下一個分組壓縮函數(shù)輸入的一部分,直到最后一
個壓縮函數(shù)的輸出,將被作為整個消息散列的結(jié)果。MD5 和 SHA1 可以說是目前應用最廣泛的Hash算法,而它
們都是以MD4 為基礎設計的。
設計高效算法往往需要使用Hash鏈表,常數(shù)級的查找速度是任何別的算法無法比擬的,Hash鏈表的構(gòu)造和沖突
的不同實現(xiàn)方法對效率當然有一定的影響,然而Hash函數(shù)是Hash鏈表最核心的部分,下面是幾款經(jīng)典軟件中使
用到的字符串Hash函數(shù)實現(xiàn),通過閱讀這些代碼,我們可以在Hash算法的執(zhí)行效率、離散性、空間利用率等方
面有比較深刻的了解。
下面分別介紹幾個經(jīng)典軟件中出現(xiàn)的字符串Hash函數(shù)。 ●PHP中出現(xiàn)的字符串Hash函數(shù)
static unsigned long hashpjw(char *arKey, unsigned int nKeyLength) |
●OpenSSL中出現(xiàn)的字符串Hash函數(shù)
unsigned long lh_strhash(char *str) |
●MySql中出現(xiàn)的字符串Hash函數(shù)
#ifndef NEW_HASH_FUNCTION /* Calc hashvalue for a key (區(qū)分大小寫)*/ |
●另一個經(jīng)典字符串Hash函數(shù)
unsigned int hash(char *str) |
總結(jié)
以上是生活随笔為你收集整理的hash算法和常见的hash函数 [转]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: delphi : 窗体的close,fr
- 下一篇: web开发(四) 一次性验证码的代码实现