數據結構與算法-學習筆記(16)

什麼是哈希算法

將任意長度的二進制值串映射爲固定長度的二進制值串,這個映射的規則就是哈希算法,獲得的二進制值串就是哈希值。 一個hash算法須要知足幾點要求:算法

  • 從哈希值不能反向推導出原始數據(因此哈希算法也叫單向哈希算法);
  • 對輸入數據很是敏感,哪怕原始數據只修改了一個bit,最後獲得的hash值也大不相同;
  • 散列衝突的機率很小,不一樣的原始數據,哈希值相同的機率很是小;
  • 哈希算法的執行效率要儘可能高效,針對較長的文本,也能快速的計算出哈希值。

哈希算法的應用

  1. 安全加密
  • MD5(消息摘要算法)、SHA(安全散列)、DES(數據加密標準)、AES(高級加密標準)等。
  • 哈希算法沒法作到零衝突(鴿巢原理):哈希值是固定長度的數據串(如MD5:128bit)所以哈希值的數量也是有限的2^128。對於無限的數據進行哈希算法獲得有限的哈希值,確定會有衝突的。但如2^128已是個很龐大的數據範圍了,想破解很是之難了。
  • 實際開發中選取加密算法,要衡量破解難度和計算時間。
  1. 惟一標識

經過一個較短的二進制串表示一個很大的數據。後端

若是想從海量圖庫中查找一張圖片。由於圖片元數據(名稱、地點等信息)可能會相同沒辦法惟一標識一張圖片。所以咱們能夠從圖片的二進制碼串(任何文件在計算中均可以表示成二進制碼串)前中後三個部位取100B數據,把這300Byte合併經過哈希算法(如MD5)獲得一個哈希值做爲圖片的惟一標識。在根據前邊學的查找相關的算法,能夠把圖片的惟一標識做爲key,和相應圖片文件在圖庫中的路徑信息都存儲在散列表中,在散列表中經過key能夠在O(1)下查找到圖片。安全

  1. 數據校驗 數據在網絡中進行傳輸,頗有可能被惡意修改,致使文件沒法打開,甚至致使電腦中毒。如何檢測數據是否被篡改呢?哈希算法對數據很敏感,只要數據有一點變化生成的哈希值就會變化,所以能夠對數據進行哈希,獲得哈希值。當收到文件時,再對文件進行相同哈希函數計算獲得哈希值和原始哈希值進行比較,不一樣則說明數據被篡改了。服務器

  2. 散列函數 以前的散列函數也是哈希算法的一種應用,只不過它更關注散列後的值是否平均分佈,散列函數執行的快慢,所以散列函數通常比較簡單,追求效率。網絡

對用戶密碼進行傳輸如何作更安全呢? 僅對密碼進行MD5/SHA加密仍是有很大的可能被攻破,由於有的用戶設置的密碼太簡單(如:654321等)攻擊者能夠進行字典攻擊:字典中存儲攻擊者可能猜到的各類密碼組合和對應加密後的數據串,這樣拿到加密後的數據,在字典中查找,極可能就破解了。併發

針對字典攻擊,能夠引入一個鹽,和用戶密碼組合在一塊兒增長密碼複雜度,在進行哈希算法加密,這樣就提升了破解難度。負載均衡

哈希算法解決分佈式問題

  1. 負載均衡 如何把同一個客戶端上的全部請求都路由到同一個後端服務器上呢?
  • 最簡單的方法:維護一張客戶端IP和服務器編號的映射關係表。客戶端每次發請求,找到表中對應的服務器編號,請求。可是這種方式有幾個弊端:
    • 客戶端不少,表會很大,浪費內存空間;
    • 客戶端上線下線、服務器擴容縮容都會致使映射關係失效,表的維護成本高。
  • 哈希算法:對客戶端的IP地址計算哈希值,再將哈希值與服務器編號列表的大小進行取模,獲得的值加上服務器編號起始值就獲得了服務器編號。這樣就保證了同一個IP最終計算獲得的編號值都是同樣的(並不須要保證服務器一直都是同一個)。
  1. 數據分片

若是有1T的日誌文件,記錄了用戶的搜索關鍵字,如何快速統計出每一個關鍵詞被搜索的次數呢?分佈式

最開始想到了桶排序,把相同的數據放同一個桶中,最後統計桶中數據個數。但這樣就有兩個問題:函數

  • 有1T的數據,一塊兒取出來計算機內存根本放不下,並且還要爲桶開闢空間。
  • 如何把一個數據放到一個桶中呢?經過哪一種映射關係呢?

結合上述問題的到的處理方法:一個計算機放不下,能夠用多臺計算機併發處理。這樣咱們能夠把每臺計算機看作一個桶。那麼如何把數據放到對應的計算機中呢?想到了哈希算法:對每一個數據計算哈希值,而後再根計算機編號列表大小n取模的計算機編號,數據就放到對應編號的計算機中。這樣相同數據確定放在同一個計算機中。在每一個計算機在分別計算相同數據出現的次數,最後在合併結果便可。加密

這種思想(MapReduce)結合了桶(數據分片)、哈希算法、散列函數(取模對應列表index)。

若是再1億張圖片中找一張圖片,也能夠用上述的思想來解決。

針對這種海量數據問題的處理,均可以採用多機分佈式處理,藉助這種分片思路能夠突破單機內存、CPU等資源的限制。

  1. 分佈式存儲 數據分片時若是增長了一臺計算機,那麼本來散列函數獲得的結果就都失效了,須要所有數據從新計算一次。須要一致性哈希算法。(待補充)
相關文章
相關標籤/搜索