色々調べてみたけど、Swift3系でそのまま動かなかったので、メモとして残します。
準備
Objective-C のライブラリを使うので、Swift で使う場合は、Bridging-Header.h
に下記の行を追加
Bridging-Header.h
#import <CommonCrypto/CommonCrypto.h>
sha1 の場合
let data = "文字列".data(using: .utf8)!
let length = Int(CC_SHA1_DIGEST_LENGTH)
var digest = [UInt8](repeating: 0, count: length)
_ = data.withUnsafeBytes { CC_SHA1($0, CC_LONG(data.count), &digest) }
let crypt = digest.map { String(format: "%02x", $0) }.joined(separator: "")
MD5 の場合
let data = "文字列".data(using: .utf8)!
let length = Int(CC_MD5_DIGEST_LENGTH)
var digest = [UInt8](repeating: 0, count: length)
_ = data.withUnsafeBytes { CC_MD5($0, CC_LONG(data.count), &digest) }
let crypt = digest.map { String(format: "%02x", $0) }.joined(separator: "")
解説
-
data.withUnsafeBytes
は戻り値を_ =
で捨てています。
無いとResult of call to 'withUnsafeBytes' is unused
とワーニング出ます。 -
String(format: "%02x", $0)
の箇所を、String($0, raddix: 16)
と書いてる記事もありますが、0 が消えるので、format 指定にしています。