【问题标题】:md5 hash returns with encapsulation in swiftmd5 散列在 swift 中封装返回
【发布时间】:2015-09-26 06:48:45
【问题描述】:

我使用了这个md5,得到了散列结果。但是,返回是这样的:<8f833933 03a151ea 33bf6e3e bbc28594>。我是 swift 新手,所以不完全确定它是否是封装。如何去掉小于号和大于号?

【问题讨论】:

  • 这意味着 NSData 对象是使用其description 方法打印的。如果您搜索“NSData to hex string”,那么您应该会找到一些解决方案(例如:stackoverflow.com/a/29642198/1187415)。

标签: swift md5


【解决方案1】:

从签名中可以看出,该函数返回一个 NSData 对象:

func md5(#string: String) -> NSData

如果要将其转换为字符串,则需要将其编码为人类可读的格式。最常见的是十六进制表示。

如果您使用该问题中较新的 Swift 2 函数,该函数返回 UInt8 数组

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
}

您可以使用这个方便的toHex 函数:

func toHex(bytes: [UInt8]) -> String {
    var numbers = [String]()
    for byte in bytes {
        if byte < 0x10 {
            numbers.append("0")
        }
        numbers.append(String(byte, radix: 16, uppercase: true))
    }
    return numbers.joinWithSeparator("")
}

然后这会返回一个字符串:

toHex(md5("Hello"))

(在我看来,您应该始终更喜欢纯 Swift 类型(UInt8 数组)而不是 Foundation 类型(NSData)。)

【讨论】:

  • @user3813647 如果此答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
猜你喜欢
  • 1970-01-01
  • 2012-06-17
  • 2014-11-18
  • 2016-09-19
  • 1970-01-01
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多