在OS X下,计算得的正确md5值是:63e3fbe6 a0438f26 e49e5dab 1c4af0d3。
NSData *temp = [[NSData alloc] initWithContentsOfFile:@"/Users/apple/Pictures/temp/tu7.png"];
NSLog(@"md5: %@", [temp md5]);
在iOS中,UIImagePickerControllerDelegate协议,imagePickerController: didFinishPickingMediaWithInfo:方法,计算的的md5值是:55ea2f62 5df31067 683aa9a8 3a06d420。
UIImage *image = info[UIImagePickerControllerOriginalImage];
NSData *temp = UIImagePNGRepresentation(image);
NSLog(@"md5: %@", [temp md5]);
两个md5值结果不一样,我希望计算图片整个文件的md5,因为要拿这个md5值与服务器上贮存的图片进行比对,服务器上图片文件计算得md5与通过绝对路径计算得md5相同,所以我尝试获取被选中图片的路径,像/Users/apple/Pictures/temp/tu7.png这种形式的,我知道通过info可以获取asset library url。
NSURL *imgurl = [info objectForKey:UIImagePickerControllerReferenceURL];
获得的结果是像assets-library://asset/asset.JPG?id=00000000-0000-0000-0000-00000000007E&ext=JPG这种形式的。
(NSString *)fileMD5WithAsset:(ALAsset *)asset
{
if (!asset) {
return nil;
}
ALAssetRepresentation *rep = [asset defaultRepresentation];
unsigned long readStep = 256;
uint8_t *buffer = calloc(readStep, sizeof(*buffer));
unsigned long long offset = 0;
unsigned long long bytesRead = 0;
NSError *error = nil;
unsigned long long fileSize = [rep size];
int chunks = (int)((fileSize + readStep - 1)/readStep);
unsigned long long lastChunkSize = fileSize%readStep;
CC_MD5_CTX md5;
CC_MD5_Init(&md5);
BOOL isExp = NO;
int currentChunk = 0;
while(!isExp && currentChunk < chunks){
@try {
if(currentChunk < chunks - 1){
bytesRead = [rep getBytes:buffer fromOffset:offset length:(unsigned long)readStep error:&error];
}else{
bytesRead = [rep getBytes:buffer fromOffset:offset length:(unsigned long)lastChunkSize error:&error];
}
NSData * fileData = [NSData dataWithBytesNoCopy:buffer length:(unsigned long)bytesRead freeWhenDone:NO];
CC_MD5_Update(&md5, [fileData bytes], (CC_LONG)[fileData length]);
offset += readStep;
} @catch(NSException exception) {
isExp = YES;
free(buffer);
}
currentChunk += 1;
}
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;
}