Swift で SHA-1 ハッシュを得る
プログラムを Objective-C で書くより Swift で書いたほうがあとあと見通しがよい、ということで Swift で書くことにした。
Stack Overflow に投稿された CommonHMAC in Swift を参考に SHA-1 ハッシュを得る機能拡張 (extension) を String クラスに対して行った。
Swift のみで書かれているプロジェクトでこの機能を使うには、 bridging header と呼ばれるものを作る必要がある。新規ファイルで Objective-C File を選ぶとこの bridging header を作成するか訪ねられるので Yes を選ぶ。するとプロジェクトに [プロジェクト名]-Bridging-Header.h というファイルが追加される。
この Bridging-Header.h に、使いたい Objective-C ヘッダファイルを import する。
#import <CommonCrypto/CommonCrypto.h>
あとは Swift ファイルを作成し、次の記述をする。
import Foundation extension String { // 文字列の SHA-1 ダイジェストを得る func sha1() -> String! { let str = self.cStringUsingEncoding(NSUTF8StringEncoding) let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) let digestLen = Int(CC_SHA1_DIGEST_LENGTH) let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen) CC_SHA1(str!, strLen, result) var hash = NSMutableString() for i in 0..<digestLen { hash.appendFormat("%02x", result[i]) } result.destroy() return String(hash) } }
次のように使う。
let message = "すずめかわいい" message.sha1() // => "9abec7d8659bed5329487b2438262b963f5dc755"
参考
- CommonHMAC in Swift
- let result = UnsafePointer<...>... は UnsafeMutablePointer にしないとコンパイルできないので注意
- Using Swift with Cocoa and Objective-C: Interacting with C APIs