hash 一般稱為雜湊,音譯是「雜湊」,以下就成之為雜湊,畢竟感覺高大上。
是把任意長度的輸入(又叫做預對映pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來確定唯一的輸入值。
簡單的說就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
所有雜湊函式都有下面的特性:
兩個不同的輸入值,根據同一雜湊函式計算出雜湊值相同的現象叫做碰撞。
一般的雜湊演算法都應該具有下面2個能力:
抗碰撞能力:對於任意兩個不同的資料塊,其hash值相同的可能性極小;對於乙個給定的資料塊,找到和它hash值相同的資料塊極為困難。
抗篡改能力:對於乙個資料塊,哪怕只改動其乙個位元位,其hash值的改動也會非常大。
演算法名演算法簡介
直接定址法
直接以關鍵字k或者k加上某個常數(k+c)作為雜湊位址。
數字分析法
提取關鍵字中取值比較均勻的數字作為雜湊位址。
除留餘數法
用關鍵字k除以某個不大於雜湊表長度m的數p,將所得餘數作為雜湊表位址。
分段疊加法
按照雜湊表位址位數將關鍵字分成位數相等的幾部分,其中最後一部分可以比較短。
然後將這幾部分相加,捨棄最高進製後的結果就是該關鍵字的雜湊位址。
平方取中法
如果關鍵字各個部分分布都不均勻的話,可以先求出它的平方值
然後按照需求取中間的幾位作為雜湊位址。
偽隨機數法
採用乙個偽隨機數當作雜湊函式。
衡量乙個雜湊函式的好壞的重要指標就是發生碰撞的概率以及發生碰撞的解決方案。
任何雜湊函式基本都無法徹底避免碰撞,常見的解決碰撞的方法有以下幾種:
方法名方法介紹
開放定址法
鏈位址法
將雜湊表的每個單元作為鍊錶的頭結點,所有雜湊位址為i的元素構成乙個同義詞鍊錶。
即發生衝突時就把該關鍵字鏈在以該單元為頭結點的鍊錶的尾部。
再雜湊法
當雜湊位址發生衝突用其他的函式計算另乙個雜湊函式位址,直到衝突不再產生為止。
建立公共溢位區
將雜湊表分為基本表和溢位錶兩部分,發生衝突的元素都放入溢位表中。
計算雜湊位址所需要的時間(即hash函式本身不要太複雜)
關鍵字的長度
表長關鍵字分布是否均勻,是否有規律可循
設計的hash函式在滿足以上條件的情況下儘量減少衝突
最後看下 hashmap 的內部結構圖,具體分析在以後在 hashmap原始碼閱讀裡寫。
是什麼東西 金錢是個什麼東西?
多數人看到大筆錢都會有一種莫名的興奮,為什麼會興奮呢?因為足夠的金錢能換來自己想要的東西,錢刺激著你的每根神經和細胞,你會控制不住地興奮。錢是個什麼東西?錢是所有物質的替代品,包括房子 車子 愛情 性 健康 未來。只要你方法得當,足夠的金錢可以交換幾乎所有想要的東西。錢是虛幻的。錢可以作為大多數人追...
記憶體是個什麼東西
記憶體,或記憶體儲器,又稱為主儲存器,是關係到計算機執行效能高低的關鍵部件之一,無疑是非常重要的。為了加快系統的速度,提高系統的整體效能,我們看到,計算機中配置的記憶體數量越來越大,而記憶體的種類也越來越多。記憶體是主機板上重要的部件之一,它是儲存cpu與外圍裝置溝通的資料與程式的部件。在主機中,記...
Cloudera是個什麼東西
有人說cloudera和hadoop的關係就如,ubuntu和linux的關係。而cloudera也正是想成為hadoop的發行版的提供者,實際應用的主導者。眾所周知,hadoop需要在集群上配置 安裝,在使用過程中還需要我們的管理。hadoop安裝 部署 管理的難度非常大,這使用很多使用者對had...