Câu trả lời:
md5 có sẵn trên iPhone và có thể được thêm dưới dạng bổ sung cho NSString
vàNSData
như dưới đây.
MyAdditions.h
@interface NSString (MyAdditions)
- (NSString *)md5;
@end
@interface NSData (MyAdditions)
- (NSString*)md5;
@end
MyAdditions.m
#import "MyAdditions.h"
#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access
@implementation NSString (MyAdditions)
- (NSString *)md5
{
const char *cStr = [self UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, (int)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
@implementation NSData (MyAdditions)
- (NSString*)md5
{
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( self.bytes, (int)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
Đã thêm NSData md5 vì tôi cần bản thân mình và nghĩ rằng đây là một nơi tốt để lưu đoạn trích nhỏ này ...
Các phương thức này được xác minh bằng các vectơ kiểm tra NIST MD5 trong http://www.nsrl.nist.gov/testdata/
strlen
ra cảnh báo: "Chuyển đổi ngầm định làm mất độ chính xác của số nguyên: 'dài không dấu' thành 'CC_LONG' (còn gọi là 'unsign int')"
Bạn có thể sử dụng thư viện Common Crypto tích hợp để làm như vậy. Nhớ nhập:
#import <CommonCrypto/CommonDigest.h>
và sau đó:
- (NSString *) md5:(NSString *) input
{
const char *cStr = [input UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
self
trước khi thực hiện; nếu bản thân không, nó sẽ sụp đổ.
(int)
trước đó, strlen
ví dụ (int)strlen
...
Nếu hiệu suất là quan trọng, bạn có thể sử dụng phiên bản tối ưu hóa này. Nó nhanh hơn khoảng 5 lần so với những người có stringWithFormat
hoặc NSMutableString
.
Đây là một thể loại của NSString.
- (NSString *)md5
{
const char* cStr = [self UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
static const char HexEncodeChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
char *resultData = malloc(CC_MD5_DIGEST_LENGTH * 2 + 1);
for (uint index = 0; index < CC_MD5_DIGEST_LENGTH; index++) {
resultData[index * 2] = HexEncodeChars[(result[index] >> 4)];
resultData[index * 2 + 1] = HexEncodeChars[(result[index] % 0x10)];
}
resultData[CC_MD5_DIGEST_LENGTH * 2] = 0;
NSString *resultString = [NSString stringWithCString:resultData encoding:NSASCIIStringEncoding];
free(resultData);
return resultString;
}
Kể từ khi mọi người yêu cầu một phiên bản luồng tập tin. Tôi đã sửa đổi một đoạn nhỏ rất hay được tạo bởi Joel Lopes Da Silva hoạt động với MD5, SHA1 và SHA512 VÀ nó đang sử dụng các luồng. Nó được tạo cho iOS nhưng chỉ hoạt động với những thay đổi tối thiểu trên OSX (loại bỏ phương thức ALAssetRepftimeation). Nó có thể tạo tổng kiểm tra cho các tệp được cung cấp một filepath hoặc ALAssets (sử dụng ALAssetRepftimeation). Việc phân chia dữ liệu thành các gói nhỏ làm cho bộ nhớ tác động tối thiểu bất kể kích thước tệp / kích thước tài sản.
Hiện tại nó nằm trên github tại đây: https://github.com/leetal/FileHash
Bất kỳ lý do nào để không sử dụng triển khai Apple: https://developer.apple.com/l Library / mac / document / Security /Conualual / cryptoservice / GeneralPurposeCrypto / GeneralPurposeCrypto.html # / //apple_Vf / doc / uid
Tìm kiếm Hướng dẫn Dịch vụ Mật mã trên trang web dành cho nhà phát triển của Apple.