什么是哈希算法
將任意長度的二進制值串映射為固定長度的二進制值串,這個映射的規(guī)則就是哈希算法。而通過原始數(shù)據(jù)映射之后得到的二進制值串就是哈希值。
一個優(yōu)秀的哈希算法要滿足幾點要求:
- 從哈希值不能反向推導出原始數(shù)據(jù)(所以哈希算法也叫意向哈希算法);
- 對輸入數(shù)據(jù)非常敏感,哪怕原始數(shù)據(jù)只修改了一個Bit,最后得到的哈希值也大不相同;
- 散列沖突的概率要很小,對于不同的原始數(shù)據(jù),哈希值相同的概率非常??;
- 哈希算法的執(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ū)塊是唯一標識的、不可逆、無沖突。