1. ホーム
  2. swift

[解決済み] SHA256 in swift

2022-12-20 20:14:34

質問

プロジェクトでsha256を使用したいのですが、objCのコードをswiftのコードに書き換えるのに苦労しています。助けてください。こちらの回答を参考にさせていただきました。 iOSでSHA-2(理想的にはSHA256またはSHA512)ハッシュを計算するにはどうすればよいですか?

以下は私のコードです。

var hash : [CUnsignedChar]
CC_SHA256(data.bytes, data.length, hash)
var res : NSData = NSData.dataWithBytes(hash, length: CC_SHA256_DIGEST_LENGTH)

を変換できないので、すべてエラーになります。 IntCC_LONG に変更する。

どのように解決するのですか?

の間で明示的に変換する必要があります。 IntCC_LONG というように、Swift は暗黙の変換をしないので のように暗黙の変換を行わないからです。

を定義する必要があります。 hash を必要な大きさの配列として定義する必要があります。

func sha256(data : NSData) -> NSData {
    var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
    CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
    let res = NSData(bytes: hash, length: Int(CC_SHA256_DIGEST_LENGTH))
    return res
}

あるいは NSMutableData を使って必要なバッファを確保することもできます。

func sha256(data : NSData) -> NSData {
    let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))
    CC_SHA256(data.bytes, CC_LONG(data.length), UnsafeMutablePointer(res.mutableBytes))
    return res
}

Swift 3 および 4 に対応したアップデートを行いました。

func sha256(data : Data) -> Data {
    var hash = [UInt8](repeating: 0,  count: Int(CC_SHA256_DIGEST_LENGTH))
    data.withUnsafeBytes {
        _ = CC_SHA256($0, CC_LONG(data.count), &hash)
    }
    return Data(bytes: hash)
}

Swift 5に対応したアップデートです。

func sha256(data : Data) -> Data {
    var hash = [UInt8](repeating: 0,  count: Int(CC_SHA256_DIGEST_LENGTH))
    data.withUnsafeBytes {
        _ = CC_SHA256($0.baseAddress, CC_LONG(data.count), &hash)
    }
    return Data(hash)
}