算法學習之散列算法

       Hash,一般翻譯做散列、雜湊,或音譯爲哈希,是把任意長度的輸入(又叫做預映射pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。(摘自百度百科)

       散列是以常數平均時間執行插入、刪除、查找的技術。插入、刪除、查找快;反之,不支持線性排序。Java數據結構API有HashMap、HashTable等使用了散列算法技術。

加密散列函數:一個安全的加密散列函數,它的一個關鍵特徵就是,它是單向的。這意味着,從數學和計算機學角度下去看講,從輸出來反推輸入,這簡直是不可能的。也就是說,給定一個散列,想要理解或查到提供應這個散列函數的輸入數據,它應該是不可能的。技術術語下去講,我們稱它爲逆原像阻力(pre-image resistance)。

散列算法的特點:

1、每次輸入同樣的數據,得到的結果都是一樣。散列函數總是將同樣的輸入映射到相同的索引。

2、算法應將不同的輸入數據,得到不同的結果。散列函數總是將不同的輸入映射到不同的索引。

3、散列函數知道數組有多大,只返回有效的索引。使用散列函數和數組創建hashtable數據結構。

散列函數適用於模擬映射關係快速查找,防止重複,緩存/記住數據,以免服務器處理來生成他們。散列表中解決hash衝突的情況採用了拉鍊法,把相同的hash值的不同的輸入放到一個鏈表裏面進行存儲。爲了避免鏈表過長造成的速度影響,散列表需要較低的填裝因子,良好的散列函數。

hashmap採用的times33算法,times33算法就是 nhash = nhash*33 + *key++;

 hash = (hash << 5) + hash + (int) str.charAt(i); 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章