写在前面
最近把一个在处理关于Md5的一些代码
对了NSData(Data)加密处理,然后进行校验
在这里做一个总结。
开始
头文件必须要引入
#import <CommonCrypto/CommonDigest.h>
import CommonCrypto
1、NSData MD5
1.1、OC
@implementation NSData (MD5)
- (NSString *)MD5 {
unsigned char result[16];
CC_MD5(self.bytes, (CC_LONG)self.length, result); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
@end
1.2、Swift
public extension Data {
func md5() -> String {
var digestData = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
digestData.withUnsafeMutableBytes { (digestBytes: UnsafeMutableRawBufferPointer)->Void in
self.withUnsafeBytes { (messageBytes: UnsafeRawBufferPointer)->Void in
CC_MD5(messageBytes.baseAddress, CC_LONG(count), digestBytes.bindMemory(to: UInt8.self).baseAddress)
}
}
var digestHex = ""
for index in 0 ..< Int(CC_MD5_DIGEST_LENGTH) {
digestHex += String(format: "%02x", digestData[index])
}
return digestHex
}
}
有一个方法是这样的:
extension Data {
func getMD5String() -> String {
var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
_ = withUnsafeBytes { (bytes) in
CC_MD5(bytes, CC_LONG(count), &digest)
}
var digestHex = ""
for index in 0 ..< Int(CC_MD5_DIGEST_LENGTH) {
digestHex += String(format: "%02x", digest[index])
}
return digestHex
}
}
BUT
这个地方会有一个警告:
由于withUnsafeBytes
被弃用了,所以还是要换另外的方法去解决
SO,还是建议使用第一个方法
2、NSString MD5
2.1 OC
+ ( NSString *)md5String:( NSString *)str {
const char *myPasswd = [str UTF8String ];
unsigned char mdc[ 16 ];
CC_MD5 (myPasswd, ( CC_LONG ) strlen (myPasswd), mdc);
NSMutableString *md5String = [ NSMutableString string ];
for ( int i = 0 ; i< 16 ; i++) {
[md5String appendFormat : @"%02x" ,mdc[i]];
}
return md5String;
}
OR
@implementation NSString (MD5)
- (NSString *)MD5 {
const char *cStr = [self UTF8String];
unsigned char result[16];
CC_MD5(cStr, (CC_LONG)strlen(cStr), result); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
}
@end
2.2 Swift
extension String {
func md5() -> String{
let str = self.cString(using: String.Encoding.utf8)
let strLen = CC_LONG(self.lengthOfBytes(using: String.Encoding.utf8))
let digestLen = Int(CC_MD5_DIGEST_LENGTH)
let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
CC_MD5(str!, strLen, result)
let hash = NSMutableString()
for i in 0 ..< digestLen {
hash.appendFormat("%02x", result[i])
}
result.deallocate()
return String(format: hash as String)
}
}
返回Data
func MD5(string: String) -> Data {
let length = Int(CC_MD5_DIGEST_LENGTH)
let messageData = string.data(using:.utf8)!
var digestData = Data(count: length)
_ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in
messageData.withUnsafeBytes { messageBytes -> UInt8 in
if let messageBytesBaseAddress = messageBytes.baseAddress, let digestBytesBlindMemory = digestBytes.bindMemory(to: UInt8.self).baseAddress {
let messageLength = CC_LONG(messageData.count)
CC_MD5(messageBytesBaseAddress, messageLength, digestBytesBlindMemory)
}
return 0
}
}
return digestData
}