對于給定的數(shù)據(jù)塊, 密碼哈希與摘要會生成固定大小的位序列。 這些哈希值可以簡化數(shù)據(jù)塊的比較與排序。 哈希的常見使用場景包括追蹤文件變更、下載校驗和、數(shù)據(jù)混淆以進行數(shù)據(jù)庫存儲, 以及驗證請求數(shù)據(jù)的完整性等。
iOS CommonCrypto 庫提供了對 MD5、SHA-1、SHA-256 摘要以及其他不太常用的加密算法的支持

便捷方法 md5、shal 與 sha256 都會調(diào)用 hashWithTYpe:. 雖然 CommonCrypto 庫提供了一些預(yù)定義的哈希枚舉, 應(yīng)用可以直接使用, 不過這些枚舉都沒有定義在摘要計算的上下文中。 相對于依賴未來可能會發(fā)生變化的枚舉, 應(yīng)用使用自定義的值可以限制支持的摘要算法, 這也是額外的好處

hashWithType: 實現(xiàn)中唯一不太直接的地方就是最后一步,最后一步會循環(huán)摘要計算的字節(jié)輸出, 然后將其轉(zhuǎn)換為十六進制, 即可讀的輸出。 完成好核心的哈希邏輯并將其放到一個方法中后, 實現(xiàn)每個便捷方法就只需要一行代碼即可, 如下

這種方式的額外好處就是可以輕松擴展以支持更多的摘要計算。 下面調(diào)用每個便捷方法并顯示相應(yīng)的輸出 (美國國家標準協(xié)會(NIST)提供了測試向量來驗證摘要計算的輸出, 地址 http://www.nsrl.nist.gov/testdata/):

在服務(wù)層生成哈希值的過程是類似的, 因為 PHP 支持上面代碼中實現(xiàn)的每一種摘要算法, 此外還支持一些這里沒有列出的算法。 生成哈希值的標準函數(shù)是 .hash(), 它接收持執(zhí)行的算法以及算法所需要的值。 此外, PHP 還提供了一些便捷函數(shù)來生 MD5 與 SHA1 哈希值。?

上述示例展示了如何生成字符串對象的哈希值, 不過也可以很輕松地生成 NSData 對象的哈希值, 方式是在 NSData 上創(chuàng)建一個類似的類別。 然而, 如果有更為復(fù)雜需求或是想在 iOS 應(yīng)用中比較哈希值, 可以考慮創(chuàng)建自定義類, 從而優(yōu)化初始化并通過重寫 isEqualTo: 來簡化哈希值的比較。 不過, 使用哈希算法可以檢測到內(nèi)容的變化, 同時消息認證碼與密鑰是配對的, 并且更加安全