校验和 (Checksum)

Platform Swift support Carthage compatible Swift Package Manager compatible

GitHub tag License

扩展了 StringDataURL,通过遵循 Checksumable 协议,使其能够轻松高效地计算相关内容的加密校验和。

底层使用了 Apple 的 CommonCrypto 框架。

要求

文档

特性

支持的摘要算法

MD5SHA1SHA224SHA256SHA384SHA512

异步处理

处理和进度监控在后台调度队列上异步执行。默认情况下,进度和完成闭包在 .main 调度队列上调用。但是,也可以指定不同的 DispatchQueue

异步处理的函数签名是

同步处理

在有效负载非常小的情况下,可能不需要或不希望进行异步处理。对于这种情况,提供了同步版本。

同步处理的函数签名是

处理本地或远程 URL

任何具有 filehttphttps 方案的 URL 都可以用作输入。 但是,目前对 httphttps 的支持是实验性的,并有以下要求

  1. HTTP 服务器必须能够响应 HEAD 请求,以便确定 URL 是否可访问。
  2. HTTP 服务器必须能够提供 206 Partial Content 响应。

批量处理

还包括对处理 Checksumable 项目数组的支持,并在下面的示例中进行了展示。

示例

异步计算一些 Data 的校验和

data.checksum(algorithm: .md5) { result in
    switch result {
    case .success(let checksum):
        // Use checksum
    case .failure(let error):
        // Unable to obtain checksum
    }
}

异步计算给定 URL 处内容的校验和

remoteURL.checksum(algorithm: .sha256) { result in
    switch result {
    case .success(let checksum):
        // Use checksum
    case .failure(let error):
        // Unable to obtain checksum
    }
}

异步计算给定 URLs 处内容的校验和

[someURL, anotherURL, yetAnotherURL].checksum(algorithm: .md5) { result in
    switch result {
    case .success(let checksumResults):
        // Use results object
        
        for checksumResult in checksumResults {
            guard let url = checksumResult.checksumable as? URL else {
                fail("Expected checksumable to be of type URL.")
                return
            }
            
            if let checksum = checksumResult.checksum {
                print("Checksum of \(result.checksumable) is \(checksumResult.checksum)")
            } else {
                print("Unable to obtain checksum for \(checksumResult.checksumable)")
            }
        }
    case .failure(let error):
        // Unable to obtain checksums
    }
}

同步计算一些 String 的校验和

if let checksum = string.checksum(algorithm: .md5) {
    // Use checksum
}

同步计算一些 Data 的校验和

if let checksum = data.checksum(algorithm: .md5) {
    // Use checksum
}

同步计算给定 URL 处内容的校验和

if let checksum = localURL.checksum(algorithm: .md5) {
    // Use checksum
}

进度报告

您可以通过将 ProgressHandler 闭包传递给 checksum(algorithm:chunkSize:queue:progress:completion:) 中的 progress 参数来监视进度。

示例

remoteURL.checksum(algorithm: .sha256, progress: { progress in
    // Add your progress handling code here.
    print("Fraction completed: \(progress.fractionCompleted)")
}) { result in 
    /// Result handling ommited.
}

许可

Checksum 由 Ruben Nine (@sonicbee9) 编写,并根据 MIT 许可获得许可。 请参阅 LICENSE.md