我正在开发Objective C
Cocoa应用程序.我测试了
CC_MD5 in CommonCrypto,它工作得很好;然而,当我给它5个gygabyte文件,我的整个电脑冻结和坠毁. MD5算法处理输入为512字节的块,并不真正要求所有的输入一次.目标C或C中是否有一个库,要求下一个512字节的块,而不是一次全部输入?
解决方法
在这里,在obj-C中计算大文件的MD5是一个很好的线索:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/17659-calculating-md5-hash-large-file.html
http://www.iphonedevsdk.com/forum/iphone-sdk-development/17659-calculating-md5-hash-large-file.html
这是有人想到的解决方案:
+(NSString*)fileMD5:(NSString*)path { NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:path]; if( handle== nil ) return @"ERROR GETTING FILE MD5"; // file didnt exist CC_MD5_CTX md5; CC_MD5_Init(&md5); BOOL done = NO; while(!done) { NSAutoreleasePool * pool = [NSAutoreleasePool new]; NSData* fileData = [handle readDataOfLength: CHUNK_SIZE ]; CC_MD5_Update(&md5,[fileData bytes],[fileData length]); if( [fileData length] == 0 ) done = YES; [pool drain]; } unsigned char digest[CC_MD5_DIGEST_LENGTH]; CC_MD5_Final(digest,&md5); NSString* s = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",digest[0],digest[1],digest[2],digest[3],digest[4],digest[5],digest[6],digest[7],digest[8],digest[9],digest[10],digest[11],digest[12],digest[13],digest[14],digest[15]]; return s; }