對于給定的數據塊, 密碼哈希與摘要會生成固定大小的位序列。 這些哈希值可以簡化數據塊的比較與排序凉逛。 哈希的常見使用場景包括追蹤文件變更、下載校驗和群井、數據混淆以進行數據庫存儲状飞, 以及驗證請求數據的完整性等。
iOS CommonCrypto 庫提供了對 MD5书斜、SHA-1诬辈、SHA-256 摘要以及其他不太常用的加密算法的支持
便捷方法 md5、shal 與 sha256 都會調用 hashWithTYpe:. 雖然 CommonCrypto 庫提供了一些預定義的哈希枚舉荐吉, 應用可以直接使用焙糟, 不過這些枚舉都沒有定義在摘要計算的上下文中。 相對于依賴未來可能會發(fā)生變化的枚舉样屠, 應用使用自定義的值可以限制支持的摘要算法穿撮, 這也是額外的好處
hashWithType: 實現中唯一不太直接的地方就是最后一步,最后一步會循環(huán)摘要計算的字節(jié)輸出痪欲, 然后將其轉換為十六進制悦穿, 即可讀的輸出。 完成好核心的哈希邏輯并將其放到一個方法中后业踢, 實現每個便捷方法就只需要一行代碼即可栗柒, 如下
這種方式的額外好處就是可以輕松擴展以支持更多的摘要計算。 下面調用每個便捷方法并顯示相應的輸出 (美國國家標準協(xié)會(NIST)提供了測試向量來驗證摘要計算的輸出知举, 地址 http://www.nsrl.nist.gov/testdata/):
在服務層生成哈希值的過程是類似的瞬沦, 因為 PHP 支持上面代碼中實現的每一種摘要算法, 此外還支持一些這里沒有列出的算法雇锡。 生成哈希值的標準函數是 .hash(), 它接收持執(zhí)行的算法以及算法所需要的值逛钻。 此外, PHP 還提供了一些便捷函數來生 MD5 與 SHA1 哈希值锰提。?
上述示例展示了如何生成字符串對象的哈希值曙痘, 不過也可以很輕松地生成 NSData 對象的哈希值, 方式是在 NSData 上創(chuàng)建一個類似的類別欲账。 然而屡江, 如果有更為復雜需求或是想在 iOS 應用中比較哈希值, 可以考慮創(chuàng)建自定義類赛不, 從而優(yōu)化初始化并通過重寫 isEqualTo: 來簡化哈希值的比較惩嘉。 不過, 使用哈希算法可以檢測到內容的變化踢故, 同時消息認證碼與密鑰是配對的文黎, 并且更加安全