扩展了 String
、Data
和 URL
,通过遵循 Checksumable
协议,使其能够轻松高效地计算相关内容的加密校验和。
底层使用了 Apple 的 CommonCrypto
框架。
MD5
、SHA1
、SHA224
、SHA256
、SHA384
、SHA512
处理和进度监控在后台调度队列上异步执行。默认情况下,进度和完成闭包在 .main
调度队列上调用。但是,也可以指定不同的 DispatchQueue
。
异步处理的函数签名是
checksum(algorithm:chunkSize:queue:progress:completion:)
在有效负载非常小的情况下,可能不需要或不希望进行异步处理。对于这种情况,提供了同步版本。
同步处理的函数签名是
checksum(algorithm:chunkSize:)
任何具有 file
、http
或 https
方案的 URL 都可以用作输入。 但是,目前对 http
和 https
的支持是实验性的,并有以下要求
HEAD
请求,以便确定 URL
是否可访问。还包括对处理 Checksumable
项目数组的支持,并在下面的示例中进行了展示。
data.checksum(algorithm: .md5) { result in
switch result {
case .success(let checksum):
// Use checksum
case .failure(let error):
// Unable to obtain checksum
}
}
remoteURL.checksum(algorithm: .sha256) { result in
switch result {
case .success(let checksum):
// Use checksum
case .failure(let error):
// Unable to obtain checksum
}
}
[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
}
}
if let checksum = string.checksum(algorithm: .md5) {
// Use checksum
}
if let checksum = data.checksum(algorithm: .md5) {
// Use checksum
}
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。