構(gòu)造hash函數(shù)的方法赋续、解決沖突的方法、常見hash算法

轉(zhuǎn)載:http://blog.csdn.net/tanggao1314/article/details/51457585

構(gòu)造hash函數(shù)的方法

  1. 直接定址法

直接定址法是以數(shù)據(jù)元素關(guān)鍵字k本身或它的線性函數(shù)作為它的哈希地址快耿,即:H(k)=k 或 H(k)=a×k+b 囊陡; (其中a,b為常數(shù))。

  1. 數(shù)字分析法

假設(shè)關(guān)鍵字集合中的每個(gè)關(guān)鍵字都是由 s 位數(shù)字組成 (u1, u2, …, us)掀亥,分析關(guān)鍵字集中的全體撞反,并從中提取分布均勻的若干位或它們的組合作為地址。

數(shù)字分析法是取數(shù)據(jù)元素關(guān)鍵字中某些取值較均勻的數(shù)字位作為哈希地址的方法搪花。即當(dāng)關(guān)鍵字的位數(shù)很多時(shí)遏片,可以通過(guò)對(duì)關(guān)鍵字的各位進(jìn)行分析,丟掉分布不均勻的位撮竿,作為哈希值吮便。它只適合于所有關(guān)鍵字值已知的情況。

  1. 折疊法

將關(guān)鍵字分割成若干部分幢踏,然后取它們的疊加和為哈希地址髓需。兩種疊加處理的方法:移位疊加:將分 割后的幾部分低位對(duì)齊相加;邊界疊加:從一端沿分割界來(lái)回折疊房蝉,然后對(duì)齊相加僚匆。

  1. 平方取中法

這是一種常用的哈希函數(shù)構(gòu)造方法。這個(gè)方法是先取關(guān)鍵字的平方搭幻,然后根據(jù)可使用空間的大小白热,選取平方數(shù)是中間幾位為哈希地址。
哈希函數(shù) H(key)=“key2的中間幾位”因?yàn)檫@種方法的原理是通過(guò)取平方擴(kuò)大差別粗卜,平方值的中間幾位和這個(gè)數(shù)的每一位都相關(guān)屋确,則對(duì)不同的關(guān)鍵字得到的哈希函數(shù)值不易產(chǎn)生沖突,由此產(chǎn)生的哈希地址也較為均勻。

  1. 減去法

減去法是數(shù)據(jù)的鍵值減去一個(gè)特定的數(shù)值以求得數(shù)據(jù)存儲(chǔ)的位置攻臀。

  1. 基數(shù)轉(zhuǎn)換法

將十進(jìn)制數(shù)X看作其他進(jìn)制焕数,比如十三進(jìn)制,再按照十三進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制數(shù)刨啸,提取其中若干位作為X的哈希值堡赔。一般取大于原來(lái)基數(shù)的數(shù)作為轉(zhuǎn)換的基數(shù),并且兩個(gè)基數(shù)應(yīng)該是互素的设联。

  1. 除留余數(shù)法

除留余數(shù)法的模p取不大于表長(zhǎng)且最接近表長(zhǎng)m素?cái)?shù)時(shí)效果最好善已,且p最好取1.1n~1.7n之間的一個(gè)素?cái)?shù)(n為存在的數(shù)據(jù)元素個(gè)數(shù))。

  1. 隨機(jī)數(shù)法

設(shè)定哈希函數(shù)為:H(key) = Random(key)其中离例,Random 為偽隨機(jī)函數(shù)
此法適于:對(duì)長(zhǎng)度不等的關(guān)鍵字構(gòu)造哈希函數(shù)换团。

9.隨機(jī)乘數(shù)法

亦稱為“乘余取整法”。隨機(jī)乘數(shù)法使用一個(gè)隨機(jī)實(shí)數(shù)f,0≤f<1,乘積fk的分?jǐn)?shù)部分在0~1之間宫蛆,用這個(gè)分?jǐn)?shù)部分的值與n(哈希表的長(zhǎng)度)相乘艘包,乘積的整數(shù)部分就是對(duì)應(yīng)的哈希值,顯然這個(gè)哈希值落在0~n-1之間耀盗。其表達(dá)公式為:Hash(k)=「n(fk%1)」其中“fk%1”表示fk 的小數(shù)部分想虎,即fk%1=fk-「fk」

10.字符串?dāng)?shù)值哈希法

在很都情況下關(guān)鍵字是字符串,因此這樣對(duì)字符串設(shè)計(jì)Hash函數(shù)是一個(gè)需要討論的問(wèn)題叛拷。下列函數(shù)是取字符串前10個(gè)字符來(lái)設(shè)計(jì)的哈希函數(shù)舌厨。

  1. 旋轉(zhuǎn)法

旋轉(zhuǎn)法是將數(shù)據(jù)的鍵所代表的的數(shù)字中的部分位進(jìn)行旋轉(zhuǎn)。旋轉(zhuǎn)法通常并不直接使用在哈希函數(shù)上忿薇,而是搭配其他哈希函數(shù)使用裙椭。
例如,某學(xué)校同一個(gè)系的新生(小于100人)的學(xué)號(hào)前5位數(shù)是相同的煌恢,只有最后2位數(shù)不同骇陈,我們將最后一位數(shù)震庭,旋轉(zhuǎn)放置到第一位瑰抵,其余的往右移。


解決“ 沖突 ”的方法

常用的解決沖突方法有以下四種:

1.開放定址法

這種方法也稱再散列法器联,其基本思想是:當(dāng)關(guān)鍵字key的哈希地址p=H(key)出現(xiàn)沖突時(shí)二汛,以p為基礎(chǔ),產(chǎn)生另一個(gè)哈希地址p1拨拓,如果p1仍然沖突肴颊,再以p為基礎(chǔ),產(chǎn)生另一個(gè)哈希地址p2渣磷,…婿着,直到找出一個(gè)不沖突的哈希地址pi ,將相應(yīng)元素存入其中。

主要有以下三種:

(1)線性探測(cè)再散列

沖突發(fā)生時(shí)竟宋,順序查看表中下一單元提完,直到找出一個(gè)空單元或查遍全表。

(2)二次探測(cè)再散列

沖突發(fā)生時(shí)丘侠,在表的左右進(jìn)行跳躍式探測(cè)徒欣,比較靈活。

(3)偽隨機(jī)探測(cè)再散列

具體實(shí)現(xiàn)時(shí)蜗字,應(yīng)建立一個(gè)偽隨機(jī)數(shù)發(fā)生器打肝,(如i=(i+p) % m),并給定一個(gè)隨機(jī)數(shù)做起點(diǎn)挪捕。

2.再哈希法

這種方法是同時(shí)構(gòu)造多個(gè)不同的哈希函數(shù):
Hi=RH1(key) i=1粗梭,2习蓬,…章咧,k

當(dāng)哈希地址Hi=RH1(key)發(fā)生沖突時(shí),再計(jì)算Hi=RH2(key)……亲轨,直到?jīng)_突不再產(chǎn)生妄讯。這種方法不易產(chǎn)生聚集孩锡,但增加了計(jì)算時(shí)間。

3.拉鏈法

這種方法的基本思想是將所有哈希地址為i的元素構(gòu)成一個(gè)稱為同義詞鏈的單鏈表亥贸,并將單鏈表的頭指針存在哈希表的第i個(gè)單元中躬窜,因而查找、插入和刪除主要在同義詞鏈中進(jìn)行炕置。鏈地址法適用于經(jīng)常進(jìn)行插入和刪除的情況荣挨。

4.建立公共溢出區(qū)

這種方法的基本思想是:將哈希表分為基本表和溢出表兩部分,凡是和基本表發(fā)生沖突的元素朴摊,一律填入溢出表


常見hash算法

了解了hash基本定義默垄,就不能不提到一些著名的hash算法,MD5 和 SHA-1 可以說(shuō)是目前應(yīng)用最廣泛的Hash算法甚纲,而它們都是以 MD4 為基礎(chǔ)設(shè)計(jì)的口锭。那么他們都是什么意思呢?

這里簡(jiǎn)單說(shuō)一下:

(1)MD4

MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設(shè)計(jì)的,MD 是 Message Digest 的縮寫介杆。它適用在32位字長(zhǎng)的處理器上用高速軟件實(shí)現(xiàn) —— 它是基于 32 位操作數(shù)的位操作來(lái)實(shí)現(xiàn)的鹃操。

(2)MD5

MD5(RFC 1321)是 Rivest 于1991年對(duì)MD4的改進(jìn)版本。它對(duì)輸入仍以512位分組春哨,其輸出是4個(gè)32位字的級(jí)聯(lián)荆隘,與 MD4 相同。MD5比MD4來(lái)得復(fù)雜赴背,并且速度較之要慢一點(diǎn)椰拒,但更安全晶渠,在抗分析和抗差分方面表現(xiàn)更好

(3)SHA-1 及其他

SHA1是由NIST NSA設(shè)計(jì)為同DSA一起使用的,它對(duì)長(zhǎng)度小于264的輸入燃观,產(chǎn)生長(zhǎng)度為160bit的散列值乱陡,因此抗窮舉(brute-force)性更好。SHA-1 設(shè)計(jì)時(shí)基于和MD4相同原理,并且模仿了該算法仪壮。

那么這些Hash算法到底有什么用呢?

Hash算法在信息安全方面的應(yīng)用主要體現(xiàn)在以下的3個(gè)方面:

  • 文件校驗(yàn)

我們比較熟悉的校驗(yàn)算法有奇偶校驗(yàn)和CRC校驗(yàn)憨颠,這2種校驗(yàn)并沒有抗數(shù)據(jù)篡改的能力,它們一定程度上能檢測(cè)并糾正數(shù)據(jù)傳輸中的信道誤碼积锅,但卻不能防止對(duì)數(shù)據(jù)的惡意破壞爽彤。

MD5 Hash算法的"數(shù)字指紋"特性,使它成為目前應(yīng)用最廣泛的一種文件完整性校驗(yàn)和(Checksum)算法缚陷,不少Unix系統(tǒng)有提供計(jì)算md5 checksum的命令适篙。

  • 數(shù)字簽名

Hash 算法也是現(xiàn)代密碼體系中的一個(gè)重要組成部分。由于非對(duì)稱算法的運(yùn)算速度較慢箫爷,所以在數(shù)字簽名協(xié)議中嚷节,單向散列函數(shù)扮演了一個(gè)重要的角色。 對(duì) Hash 值虎锚,又稱"數(shù)字摘要"進(jìn)行數(shù)字簽名硫痰,在統(tǒng)計(jì)上可以認(rèn)為與對(duì)文件本身進(jìn)行數(shù)字簽名是等效的。而且這樣的協(xié)議還有其他的優(yōu)點(diǎn)窜护。

  • 鑒權(quán)協(xié)議

如下的鑒權(quán)協(xié)議又被稱作挑戰(zhàn)--認(rèn)證模式:在傳輸信道是可被偵聽效斑,但不可被篡改的情況下,這是一種簡(jiǎn)單而安全的方法柱徙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缓屠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子护侮,更是在濱河造成了極大的恐慌敌完,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羊初,死亡現(xiàn)場(chǎng)離奇詭異滨溉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)凳忙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門业踏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)禽炬,“玉大人涧卵,你說(shuō)我怎么就攤上這事「辜猓” “怎么了柳恐?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵伐脖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我乐设,道長(zhǎng)讼庇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任近尚,我火速辦了婚禮蠕啄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戈锻。我一直安慰自己歼跟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布格遭。 她就那樣靜靜地躺著哈街,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拒迅。 梳的紋絲不亂的頭發(fā)上骚秦,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音璧微,去河邊找鬼作箍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛前硫,可吹牛的內(nèi)容都是我干的蒙揣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼开瞭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼懒震!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嗤详,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤个扰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后葱色,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體递宅,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年苍狰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了办龄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淋昭,死狀恐怖俐填,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翔忽,我是刑警寧澤英融,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布盏檐,位于F島的核電站,受9級(jí)特大地震影響驶悟,放射性物質(zhì)發(fā)生泄漏胡野。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一痕鳍、第九天 我趴在偏房一處隱蔽的房頂上張望硫豆。 院中可真熱鬧,春花似錦笼呆、人聲如沸够庙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耘眨。三九已至,卻和暖如春境肾,著一層夾襖步出監(jiān)牢的瞬間剔难,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工奥喻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偶宫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓环鲤,卻偏偏與公主長(zhǎng)得像纯趋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冷离,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 散列表,它是基于快速存取的角度設(shè)計(jì)的吵冒,也是一種典型的“空間換時(shí)間”的做法。顧名思義西剥,該數(shù)據(jù)結(jié)構(gòu)可以理解為一個(gè)線性表...
    yeying12321閱讀 3,691評(píng)論 0 6
  • Map 是一種很常見的數(shù)據(jù)結(jié)構(gòu)瞭空,用于存儲(chǔ)一些無(wú)序的鍵值對(duì)揪阿。在主流的編程語(yǔ)言中,默認(rèn)就自帶它的實(shí)現(xiàn)咆畏。C南捂、C++ 中的...
    一縷殤流化隱半邊冰霜閱讀 9,266評(píng)論 23 67
  • 從HashMap說(shuō)起 散列表(Hash table,也叫哈希表)旧找,是依據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪...
    jiangmo閱讀 651評(píng)論 0 0
  • 關(guān)于哈希表里面的這些個(gè)定址和解決沖突的方法名詞我一直記不住溺健,今天閑下來(lái)就花點(diǎn)時(shí)間來(lái)學(xué)習(xí)之、記錄之钦讳、分享之矿瘦。 哈希函...
    風(fēng)信子丶閱讀 8,956評(píng)論 0 11
  • 四大部分 一.Cocoa Touch Cocoa Touch層包含創(chuàng)建 iOS應(yīng)用程序所需的關(guān)鍵框架。上至實(shí)現(xiàn)應(yīng)用...
    XMFraker閱讀 3,361評(píng)論 2 11