Skip to content

Instantly share code, notes, and snippets.

@zwaldowski
Last active May 3, 2018 23:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zwaldowski/8864f2d74fa45ee2cfa8ba0573abf4ef to your computer and use it in GitHub Desktop.
Save zwaldowski/8864f2d74fa45ee2cfa8ba0573abf4ef to your computer and use it in GitHub Desktop.
Swift 4 CC_SHA1 and fast toHexString extensions
import Foundation
private func loadCSymbol<T>(named name: String, of _: T.Type = T.self) -> T {
let RTLD_DEFAULT = UnsafeMutableRawPointer(bitPattern: -2)
guard let sym = dlsym(RTLD_DEFAULT, name) else { preconditionFailure(String(cString: dlerror())) }
return unsafeBitCast(sym, to: T.self)
}
private let CC_SHA1_DIGEST_LENGTH = 20
private let CC_SHA1: @convention(c) (UnsafeRawPointer, Int32, UnsafeMutablePointer<UInt8>) -> UnsafeMutablePointer<UInt8> = loadCSymbol(named: "CC_SHA1")
extension Data {
public func toHexString() -> String {
return lazy.map { (byte) in
(byte <= 0xF ? "0" : "") + String(byte, radix: 16)
}.joined()
}
}
extension String {
public func SHA1Sum() -> String {
return withCString { (ptr) in
var data = Data(repeating: 0, count: CC_SHA1_DIGEST_LENGTH)
_ = data.withUnsafeMutableBytes { CC_SHA1(ptr, numericCast(strlen(ptr)), $0) }
return data.toHexString()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment