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"

参考