import Foundation import CommonCrypto import CryptoKit // MARK: - String Hash Extensions extension String { /// 计算字符串的SHA256哈希值(推荐使用) /// - Returns: SHA256哈希值的小写十六进制字符串 @available(iOS 13.0, *) func sha256() -> String { let data = Data(self.utf8) let digest = SHA256.hash(data: data) return digest.compactMap { String(format: "%02x", $0) }.joined() } /// 计算字符串的MD5哈希值(已弃用,仅用于兼容性) /// /// ⚠️ 警告:MD5在iOS 13.0后已被弃用,因为它在加密学上是不安全的 /// 建议使用 sha256() 方法替代 /// /// - Returns: MD5哈希值的小写十六进制字符串 func md5() -> String { if #available(iOS 13.0, *) { // iOS 13+ 使用 CryptoKit 的 Insecure.MD5 let data = Data(self.utf8) let digest = Insecure.MD5.hash(data: data) return digest.compactMap { String(format: "%02x", $0) }.joined() } else { // iOS 13 以下使用 CommonCrypto let data = Data(self.utf8) let hash = data.withUnsafeBytes { bytes -> [UInt8] in var hash = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) CC_MD5(bytes.baseAddress, CC_LONG(data.count), &hash) return hash } return hash.map { String(format: "%02x", $0) }.joined() } } }