將任意長度的二進制值串映射爲固定長度的二進制值串,這個映射的規則就是哈希算法,獲得的二進制值串就是哈希值。 一個hash算法須要知足幾點要求:算法
經過一個較短的二進制串表示一個很大的數據。後端
若是想從海量圖庫中查找一張圖片。由於圖片元數據(名稱、地點等信息)可能會相同沒辦法惟一標識一張圖片。所以咱們能夠從圖片的二進制碼串(任何文件在計算中均可以表示成二進制碼串)前中後三個部位取100B數據,把這300Byte合併經過哈希算法(如MD5)獲得一個哈希值做爲圖片的惟一標識。在根據前邊學的查找相關的算法,能夠把圖片的惟一標識做爲key,和相應圖片文件在圖庫中的路徑信息都存儲在散列表中,在散列表中經過key能夠在O(1)下查找到圖片。安全
數據校驗 數據在網絡中進行傳輸,頗有可能被惡意修改,致使文件沒法打開,甚至致使電腦中毒。如何檢測數據是否被篡改呢?哈希算法對數據很敏感,只要數據有一點變化生成的哈希值就會變化,所以能夠對數據進行哈希,獲得哈希值。當收到文件時,再對文件進行相同哈希函數計算獲得哈希值和原始哈希值進行比較,不一樣則說明數據被篡改了。服務器
散列函數 以前的散列函數也是哈希算法的一種應用,只不過它更關注散列後的值是否平均分佈,散列函數執行的快慢,所以散列函數通常比較簡單,追求效率。網絡
對用戶密碼進行傳輸如何作更安全呢? 僅對密碼進行MD5/SHA加密仍是有很大的可能被攻破,由於有的用戶設置的密碼太簡單(如:654321等)攻擊者能夠進行字典攻擊:字典中存儲攻擊者可能猜到的各類密碼組合和對應加密後的數據串,這樣拿到加密後的數據,在字典中查找,極可能就破解了。併發
針對字典攻擊,能夠引入一個鹽,和用戶密碼組合在一塊兒增長密碼複雜度,在進行哈希算法加密,這樣就提升了破解難度。負載均衡
若是有1T的日誌文件,記錄了用戶的搜索關鍵字,如何快速統計出每一個關鍵詞被搜索的次數呢?分佈式
最開始想到了桶排序,把相同的數據放同一個桶中,最後統計桶中數據個數。但這樣就有兩個問題:函數
結合上述問題的到的處理方法:一個計算機放不下,能夠用多臺計算機併發處理。這樣咱們能夠把每臺計算機看作一個桶。那麼如何把數據放到對應的計算機中呢?想到了哈希算法:對每一個數據計算哈希值,而後再根計算機編號列表大小n取模的計算機編號,數據就放到對應編號的計算機中。這樣相同數據確定放在同一個計算機中。在每一個計算機在分別計算相同數據出現的次數,最後在合併結果便可。加密
若是再1億張圖片中找一張圖片,也能夠用上述的思想來解決。
針對這種海量數據問題的處理,均可以採用多機分佈式處理,藉助這種分片思路能夠突破單機內存、CPU等資源的限制。