散列函數(shù)(哈希)(轉(zhuǎn))

[TOC]
本文轉(zhuǎn)自其他人的博客。簡化了一下,方便備忘浦徊。

概述

Hash一般翻譯作散列也有直接音譯作“哈希”天梧。就是把任意長度的輸入通過散列算法變換成固定長度的輸出盔性,該輸出就是散列值。

散列值的空間通常遠(yuǎn)小于輸入的空間腿倚,不同的輸入可能會散列成相同的輸出纯出,所以不可能從散列值來確定唯一的輸入值蚯妇。

哈希函數(shù)的應(yīng)用非常廣泛,各種校驗暂筝、簽名箩言、密碼,都是哈希函數(shù)應(yīng)用的重要場景焕襟。

性質(zhì)

  • 確定性:哈希的散列值不同陨收,那么哈希的原始輸入也就不同。
  • 不確定性:同一個散列值很有可能對應(yīng)多個不同的原始輸入鸵赖。稱為“哈希碰撞”务漩。

實現(xiàn)

哈希函數(shù)的實現(xiàn)分為兩部分:構(gòu)造和解決沖突。

構(gòu)造

哈希函數(shù)的構(gòu)造應(yīng)該滿足以下準(zhǔn)則:

  • 散列函數(shù)的計算簡單它褪,快速饵骨。
  • 散列函數(shù)能將關(guān)鍵字集合K均勻地分布在地址集{0,1,…茫打,m-1}上居触,使沖突最小。

直接定址法

H(key) = key 或 H(key) = a·key + b
直接定址法老赤,不會有哈希沖突轮洋。但實際這樣使用的情況較少。

相乘取整法

H(key) = (int) ( m * ( key*A - (int)(key*A) ) ) 其中 0 < A < 1
注意:該方法最大的優(yōu)點是m的選取比除余法要求更低抬旺。比如弊予,完全可選擇它是2的整數(shù)次冪。雖然該方法對任何A的值都適用开财,但對某些值效果會更好汉柒。Knuth建議選取 0.61803……。

平方取中法

取關(guān)鍵字平方后的中間幾位為哈希地址床未。
F(a) = a的中間三位竭翠。
H(key) = F(key^2)

除留余數(shù)法

H(key) = key MOD p (p ≤ m)

隨機數(shù)法

H(key) = random (key)

jdk中HashMap的hash構(gòu)造

    static final int hash(Object var0) {
        int var1;
        return var0 == null ? 0 : (var1 = var0.hashCode()) ^ var1 >>> 16;
    }

哈希沖突的解決

開放地址法

就是在發(fā)生沖突后振坚,通過某種探測技術(shù)薇搁,去依次探查其他單元,直到探查到不沖突為止渡八,將元素添加進(jìn)去啃洋。

假如是在index的位置發(fā)生哈希沖突,那么通常有一下幾種探測方式:

線性探測法(線性探測再散列)

向后依次探測index+1屎鳍,index+2…位置宏娄,看是否沖突,直到不沖突為止逮壁,將元素添加進(jìn)去孵坚。

平方探測法

不探測index的后一個位置,而是探測2i位置,比如探測20位置上時發(fā)生沖突卖宠,接著探測2^1位置巍杈,依此類推,直至沖突解決扛伍。

再哈希法:(雙散列法)

在發(fā)生哈希沖突后筷畦,使用另外一個哈希算法產(chǎn)生一個新的地址,直到不發(fā)生沖突為止刺洒。這個應(yīng)該很好理解鳖宾。

再哈希法可以有效的避免堆積現(xiàn)象,但是缺點是不能增加了計算時間和哈希算法的數(shù)量逆航,而且不能保證在哈希表未滿的情況下鼎文,總能找到不沖突的地址。

鏈地址法(開散列法)

基本思想:

鏈表法就是在發(fā)生沖突的地址處因俐,掛一個單向鏈表漂问,然后所有在該位置沖突的數(shù)據(jù),都插入這個鏈表中女揭。插入數(shù)據(jù)的方式有多種蚤假,可以從鏈表的尾部向頭部依次插入數(shù)據(jù),也可以從頭部向尾部依次插入數(shù)據(jù)吧兔,也可以依據(jù)某種規(guī)則在鏈表的中間插入數(shù)據(jù)磷仰,總之保證鏈表中的數(shù)據(jù)的有序性。Java的HashMap類就是采取鏈表法的處理方案境蔼。

結(jié)語

哈希表一旦發(fā)生沖突灶平,其性能就會顯著下降。因此建立哈希表時必須規(guī)避哈希沖突的產(chǎn)生箍土,大多數(shù)哈希表的實現(xiàn)都是:第一步逢享,是通過哈希算法將key值轉(zhuǎn)換一個整數(shù)以確定數(shù)據(jù)的存儲位置;第二步吴藻,檢查是否發(fā)生哈希沖突瞒爬,以及確定發(fā)生沖突后的處理方案。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沟堡,一起剝皮案震驚了整個濱河市侧但,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌航罗,老刑警劉巖禀横,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粥血,居然都是意外死亡柏锄,警方通過查閱死者的電腦和手機酿箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趾娃,“玉大人七问,你說我怎么就攤上這事∶2埃” “怎么了械巡?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饶氏。 經(jīng)常有香客問我讥耗,道長,這世上最難降的妖魔是什么疹启? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任古程,我火速辦了婚禮,結(jié)果婚禮上喊崖,老公的妹妹穿的比我還像新娘挣磨。我一直安慰自己,他們只是感情好荤懂,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布茁裙。 她就那樣靜靜地躺著,像睡著了一般节仿。 火紅的嫁衣襯著肌膚如雪晤锥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天廊宪,我揣著相機與錄音矾瘾,去河邊找鬼。 笑死箭启,一個胖子當(dāng)著我的面吹牛壕翩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播傅寡,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼放妈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赏僧?” 一聲冷哼從身側(cè)響起大猛,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淀零,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膛壹,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡驾中,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年唉堪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩民。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡唠亚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出持痰,到底是詐尸還是另有隱情灶搜,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布工窍,位于F島的核電站割卖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏患雏。R本人自食惡果不足惜鹏溯,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淹仑。 院中可真熱鬧丙挽,春花似錦、人聲如沸匀借。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吓肋。三九已至瞬浓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓬坡,已是汗流浹背猿棉。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屑咳,地道東北人萨赁。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像兆龙,于是被迫代替她去往敵國和親杖爽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:https://halfrost.com/go_map_chapter_one/ https://half...
    HuJay閱讀 6,154評論 1 5
  • 一.概念 哈希表就是一種以 鍵-值(key-indexed) 存儲數(shù)據(jù)的結(jié)構(gòu)紫皇,我們只要輸入待查找的值即key慰安,即可...
    lfp901020閱讀 2,990評論 0 2
  • 哈希表定義 散列表(Hash table铃剔,也叫哈希表)撒桨,是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)...
    n油炸小朋友閱讀 4,867評論 0 22
  • 哈希表:即散列存儲結(jié)構(gòu)查刻。散列法存儲的基本思想:建立記錄關(guān)鍵碼字與其存儲位置的對應(yīng)關(guān)系,或者說凤类,由關(guān)鍵碼的值決定數(shù)據(jù)...
    linbj閱讀 6,351評論 1 5
  • 前言 每次在寫代碼寫完一行或一個文件時穗泵,都要為了一些縮進(jìn)、代碼不整齊谜疤、空行太多等等佃延,對于此現(xiàn)象,有的開發(fā)人員是避之...
    Colin_狂奔的螞蟻閱讀 25,213評論 3 8