《數(shù)據(jù)結構與算法之美》17——哈希算法(一)基本概念與應用

什么是哈希算法

將任意長度的二進制值串映射為固定長度的二進制值串,這個映射的規(guī)則就是哈希算法。而通過原始數(shù)據(jù)映射之后得到的二進制值串就是哈希值。

一個優(yōu)秀的哈希算法要滿足幾點要求:

  1. 從哈希值不能反向推導出原始數(shù)據(jù)(所以哈希算法也叫意向哈希算法);
  2. 對輸入數(shù)據(jù)非常敏感,哪怕原始數(shù)據(jù)只修改了一個Bit,最后得到的哈希值也大不相同;
  3. 散列沖突的概率要很小,對于不同的原始數(shù)據(jù),哈希值相同的概率非常??;
  4. 哈希算法的執(zhí)行效率要盡量高效,針對較長的文本,也能快速地計算出哈希值。

哈希算法的應用

哈希算法的應用有很多,常見的有:安全加密、唯一標識、數(shù)據(jù)較驗、散列函數(shù)、負載均衡、數(shù)據(jù)分片、分布式存儲。

應用一:安全加密

說到哈希算法的應用,最先想到的就是安全加密。最常用的哈希算法是MD5和SHA。

沒有絕對安全的加密。越復雜、越難破解的加密算法,需要的計算時間也越長。

應用二:唯一標識

通過哈希算法對文件進行哈希計算,得到的哈希值作為文件的唯一標識。通過這個唯一標識可以在數(shù)據(jù)庫中快速找到對應的文件。

網(wǎng)盤的秒傳功能就是基于這個方法實現(xiàn)的。在上傳之前,先計算文件的哈希值,再到數(shù)據(jù)庫中查找,如果找到,就直接提示上傳成功。

應用三:數(shù)據(jù)校驗

相信大家都用過BT下載軟件吧?我們知道,BT下載的原理是基于P2P協(xié)議的。從多個機器上并行下載一個2GB的電影,這個電影文件可能會被分割成很多個文件塊(比如分成1000塊,每塊大約2MB)。等所有文件塊都下載完成之后,再組裝成一個完整的電影文件。

具體的BT協(xié)議很復雜,校驗方法也有很多,這里說其中一種思路。

通過哈希算法,對1000個文件塊分別取哈希值,并且保存在種子文件中。當文件塊下載完成后,通過相同的哈希算法,對下載好的文件塊逐一對比。如果不同,說明這個文件塊不完成或者被篡改了,需要再生產(chǎn)從其他宿主機器上下載這個文件塊。

應用四:散列函數(shù)

散列函數(shù)是哈希算法的一種應用,更加看重的是散列的平均性和哈希算法的執(zhí)行效率。

課后思考

現(xiàn)在,區(qū)塊鏈是一個很火的領域,它被很多人神秘化,不過其底層的實現(xiàn)原理并不復雜。其中,哈希算法就是它的一個非常重要的理論基礎。你能講一講區(qū)塊鏈使用的是哪種哈希算法嗎?是為了解決什么問題而使用的呢?

  • SHA 256:產(chǎn)生一個256位哈希。這是目前比特幣正在使用的。
  • Keccak-256:產(chǎn)生256位哈希,目前由Ethereum使用。
  • CryptoNight:Monero使用的哈希函數(shù)。

保證每個區(qū)塊是唯一標識的、不可逆、無沖突。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容