轉載 https://blog.csdn.net/Walk_er/article/details/74976146
hash算法是一個摘要算法(yy:描述性算法:可以給一個物體確切的描述,但是不能通過這個描述去確定這個物體):,從數據A的基礎上,獲取一個新的數據B,那么B就是A的指紋,它從某種程度上“描述”了A。
指紋數據一般都是整型數據。
hash算法有很多應用: 加密:MD5 SHA1等;辨數據完整性(是否被篡改過);編程領域它還可以用在快速存取上,也就是Hash表。
哈希算法並不是一個特定的算法而是一類算法的統稱。哈希算法也叫散列算法,滿足這樣的關系式:f(data)=key,輸入任意長度的data數據,定長的key。這個過程是不可逆的,無法由key逆推出data,這個特性用於加密算法
場景一: 快速存取
如果你只有兩個對象(包含多條數據的集合),你想比較他們,那你肯定用不着hash算法,但是如果你有20,000個對象,當你新拿來一個對象想看看這20,000個對象里面有沒有跟他重復的那你就要循環比較20000次,挨個進行比較,再或者你想在這20000個數據中剔除掉重復的,如果迭代進行比較那就有的忙了。而如果有一個算法可以根據對象內部的多個數據生成一個新的數據(“指紋”),之后只需要比較這個指紋,那工作就立馬變的簡單了。
場景二: 信息摘要 (既描述的對比)
比如百度雲盤——人們把文件上傳上雲盤中。但其實很多文件是重復的,什么MP3之類的,基本就是那么相同的幾個。服務器沒有必要重復存儲這么多信息。一個合理的方式是,當用戶上傳一個文件時,給文件一個哈希碼。當另一個用戶上傳同一個文件時,先在服務器查有無這個哈希碼,如果有,用戶就不用上傳了,這就是所謂妙傳技術,有時候幾百M的文件,瞬間就上傳完畢就是這個道理,另一方面,再下載某個文件的時候,為了檢查所下載的文件是否完整,沒有損壞,會對下載完的文件做一次MD5,與之前的文件‘指紋’做對比。
場景三: 加密
密碼的使用,可能大家都看過諜戰片,電報以密文形式傳輸,https也是密文傳輸,這是一種既可以加密也可以解密的加密方式,一旦被敵人知道了密鑰就會被破解。不要局限於這種加密方式。還有一種加密方式,在特定條件下有用,比如登錄密碼(要求不可逆)。我們設定登錄密碼的初衷並非為了告知別人我的密碼內容是什么,那么我們的密碼就可以使用不可以解密的方式被加密,假如我設置了密碼abc,它被加密成為xyz(f(abc)=xyz),在我登錄的時候系統不需要解密xyz,而是要求我再次輸入可以被加密為xyz的密碼。
java中hashcode()方法就是產生一個對象的指紋數據,這個指紋數據有比較小的可能性會發生碰撞,這時候就只能通過equals方法來進行判斷了。
而hashcode()方法的應用就是在hashmap和hashtable了。
tip:
哈希算法將任意長度的二進制值映射為較短的固定長度的二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨后的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的,所以數據的哈希值可以檢驗數據的完整性。一般用於快速查找和加密算法
——《數據結構與算法分析》