从大于可用内存的文件中获取校验和

时间:2016-01-25 09:49:18

标签: objective-c macos nsdata checksum

我正在构建一个应用程序,我需要从文件中找到校验和。

到目前为止,我已经成功地通过将文件加载到NSData对象并使用以下代码来获取校验和:

@implementation NSData (Checksums)
    - (NSString*)md5 {
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( self.bytes, (int)self.length, result );
    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

但是,当我尝试从大于可用内存的文件(例如8GB RAM和20GB文件)中获取校验和时,此解决方案无效,因为我无法将整个文件加载到对象

有没有办法从文件中获取校验和,而无需将文件加载到NSData对象中?

1 个答案:

答案 0 :(得分:0)

您必须使用CC_MD5_InitCC_MD5_UpdateCC_MD5_Final这两项功能。您只需拨打CC_MD5_Init一次,然后将数据块传递给CC_MD5_Update,直到您完成该文件为止。然后调用CC_MD5_Final以获取文件的MD5校验和。

要阅读部分文件,请使用[NSFileHandle readDataOfLength:]

如果您需要延迟解决方案,还可以使用NSTask运行命令行工具md5