java中哈希算法有什么用

這篇文章主要介紹java中哈希算法有什么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的江夏網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

一、概念

哈希表就是一種以 鍵-值(key-indexed) 存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu),我們只要輸入待查找的值即key,即可查找到其對應(yīng)的值。哈希的思路很簡單,如果所有的鍵都是整數(shù),那么就可以使用一個(gè)簡單的無序數(shù)組來實(shí)現(xiàn):將鍵作為索引,值即為其對應(yīng)的值,這樣就可以快速訪問任意鍵的值。這是對于簡單的鍵的情況,我們將其擴(kuò)展到可以處理更加復(fù)雜的類型的鍵。

使用哈希查找有兩個(gè)步驟:

1. 使用哈希函數(shù)將被查找的鍵轉(zhuǎn)換為數(shù)組的索引。在理想的情況下,不同的鍵會(huì)被轉(zhuǎn)換為不同的索引值,但是在有些情況下我們需要處理多個(gè)鍵被哈希到同一個(gè)索引值的情況。所以哈希查找的第二個(gè)步驟就是處理沖突。

2. 處理哈希碰撞沖突。有很多處理哈希碰撞沖突的方法,本文后面會(huì)介紹拉鏈法和線性探測法。哈希表是一個(gè)在時(shí)間和空間上做出權(quán)衡的經(jīng)典例子。如果沒有內(nèi)存限制,那么可以直接將鍵作為數(shù)組的索引。那么所有的查找時(shí)間復(fù)雜度為O(1);如果沒有時(shí)間限制,那么我們可以使用無序數(shù)組并進(jìn)行順序查找,這樣只需要很少的內(nèi)存。哈希表使用了適度的時(shí)間和空間來在這兩個(gè)極端之間找到了平衡。只需要調(diào)整哈希函數(shù)算法即可在時(shí)間和空間上做出取舍。

在Hash表中,記錄在表中的位置和其關(guān)鍵字之間存在著一種確定的關(guān)系。這樣我們就能預(yù)先知道所查關(guān)鍵字在表中的位置,從而直接通過下標(biāo)找到記錄。使ASL趨近與0.

1)哈希(Hash)函數(shù)是一個(gè)映象,即將關(guān)鍵字的集合映射到某個(gè)地址集合上,它的設(shè)置很靈活,只要這個(gè)地址集合的大小不超出允許范圍即可;

2)由于哈希函數(shù)是一個(gè)壓縮映象,因此,在一般情況下,很容易產(chǎn)生“沖突”現(xiàn)象,即: key1!=key2,而 f (key1) = f(key2)。

3)只能盡量減少?zèng)_突而不能完全避免沖突,這是因?yàn)橥ǔjP(guān)鍵字集合比較大,其元素包括所有可能的關(guān)鍵字, 而地址集合的元素僅為哈希表中的地址。在構(gòu)造這種特殊的“查找表” 時(shí),除了需要選擇一個(gè)“好”(盡可能少產(chǎn)生沖突)的哈希函數(shù)之外;還需要找到一 種“處理沖突” 的方法。

二、常用哈希算法的介紹:

1.MD4

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

2.MD5

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

3.SHA-1及其他

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

三、常見哈希算法的原理

散列表,它是基于快速存取的角度設(shè)計(jì)的,也是一種典型的“空間換時(shí)間”的做法。顧名思義,該數(shù)據(jù)結(jié)構(gòu)可以理解為一個(gè)線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。

散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄,以加快查找的速度。這個(gè)映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表。

比如我們存儲(chǔ)70個(gè)元素,但我們可能為這70個(gè)元素申請了100個(gè)元素的空間。70/100=0.7,這個(gè)數(shù)字稱為負(fù)載因子。我們之所以這樣做,也是為了“快速存取”的目的。我們基于一種結(jié)果盡可能隨機(jī)平均分布的固定函數(shù)H為每個(gè)元素安排存儲(chǔ)位置,這樣就可以避免遍歷性質(zhì)的線性搜索,以達(dá)到快速存取。但是由于此隨機(jī)性,也必然導(dǎo)致一個(gè)問題就是沖突。所謂沖突,即兩個(gè)元素通過散列函數(shù)H得到的地址相同,那么這兩個(gè)元素稱為“同義詞”。這類似于70個(gè)人去一個(gè)有100個(gè)椅子的飯店吃飯。散列函數(shù)的計(jì)算結(jié)果是一個(gè)存儲(chǔ)單位地址,每個(gè)存儲(chǔ)單位稱為“桶”。設(shè)一個(gè)散列表有m個(gè)桶,則散列函數(shù)的值域應(yīng)為[0,m-1]。

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

1.文件校驗(yàn)

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

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

2.數(shù)字簽名

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

3.鑒權(quán)協(xié)議

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

以上是“java中哈希算法有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站名稱:java中哈希算法有什么用
網(wǎng)頁地址:http://muchs.cn/article2/pphgoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、商城網(wǎng)站、網(wǎng)站策劃用戶體驗(yàn)、面包屑導(dǎo)航微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)