Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何在SWIFT中从字符串中获取MD5哈希并生成桥头_Xcode_Swift_Hash_Md5 - Fatal编程技术网

Xcode 如何在SWIFT中从字符串中获取MD5哈希并生成桥头

Xcode 如何在SWIFT中从字符串中获取MD5哈希并生成桥头,xcode,swift,hash,md5,Xcode,Swift,Hash,Md5,我甚至没想到会出现这个问题,但它似乎出现了。我试图从swift中的字符串中获取md5哈希。我在上面搜索,并假设我需要像这样导入库: #import <CommonCrypto/CommonCrypto.h> 再说一遍,这也不好 然后,在建议中,添加了新模块以在Swift编译器下导入路径–在项目设置中搜索路径${SRCROOT}/CommonCrypto) 这也不好 我不敢相信做那件事这么难。我想我误解了一些步骤或什么的。如果您知道一步一步的答案,请提供帮助)您需要添加一个桥接头并向

我甚至没想到会出现这个问题,但它似乎出现了。我试图从swift中的字符串中获取md5哈希。我在上面搜索,并假设我需要像这样导入库:

#import <CommonCrypto/CommonCrypto.h>
再说一遍,这也不好 然后,在建议中,添加了新模块以在Swift编译器下导入路径–在项目设置中搜索路径${SRCROOT}/CommonCrypto)

这也不好


我不敢相信做那件事这么难。我想我误解了一些步骤或什么的。如果您知道一步一步的答案,请提供帮助)

您需要添加一个桥接头并向其添加
#import
语句

添加桥接头的最简单方法是将Objective-C文件添加到项目中,如果您想添加桥接头,请回答“是”。之后,您可以删除添加的Objective-C文件

示例代码:

func md5(#string: String) -> NSData {
    var digest = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))!
    if let data :NSData = string.dataUsingEncoding(NSUTF8StringEncoding) {
        CC_MD5(data.bytes, CC_LONG(data.length),
            UnsafeMutablePointer<UInt8>(digest.mutableBytes))
    }
    return digest
}

//Test:
let digest = md5(string:"Here is the test string")
println("digest: \(digest)")

Swift 4.1的解决方案:

import CommonCrypto

extension Data
{
    func md5() -> Data
    {
        var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH))

        self.withUnsafeBytes { (bytes : UnsafePointer<UInt8>) -> Void in
            digest.withUnsafeMutableBytes { (mutableBytes : UnsafeMutablePointer<UInt8>) -> Void in
                CC_MD5(bytes, CC_LONG(self.count), mutableBytes)
            }
        }

        return digest
    }
}
导入公共加密
扩展数据
{
func md5()->数据
{
变量摘要=数据(计数:Int(CC_MD5_摘要_长度))
self.withUnsafeBytes{(字节:UnsafePointer)->Void in
digest.withUnsafeMutableBytes{(可变字节:UnsafeMutablePointer)->中的Void
CC_MD5(字节,CC_LONG(self.count),可变字节)
}
}
返回摘要
}
}

有关
CommonCrypto
部分,请参阅。

您是否将其放在桥接头中?可能与我更喜欢此本机实现重复:@Logan注意CryptoSwift版本比CommonCrypto版本慢500倍以上。@zaph正如我所说,您的数字500是错误的,然后你开始做一些其他的事情,试图证明我的一些东西,但你不必真的,你已经知道我的反应了。我希望你从那时起做出贡献。有一种方法可以提高性能,但需要人手来完成实际工作。我打赌这是比在这里讨论更好的消磨时间的方式。当做
func md5(string string: String) -> [UInt8] {
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
        CC_MD5(data.bytes, CC_LONG(data.length), &digest)
    }

    return digest
}
import CommonCrypto

extension Data
{
    func md5() -> Data
    {
        var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH))

        self.withUnsafeBytes { (bytes : UnsafePointer<UInt8>) -> Void in
            digest.withUnsafeMutableBytes { (mutableBytes : UnsafeMutablePointer<UInt8>) -> Void in
                CC_MD5(bytes, CC_LONG(self.count), mutableBytes)
            }
        }

        return digest
    }
}