Создать SHA1 (изображения) на iPhone?(Неверные результаты) - PullRequest
1 голос
/ 10 марта 2012

Я искал везде и не могу найти решение своей проблемы. Я написал программу для Android и Windows, которая вычисляет хэш SHA1 для данного изображения. Я подтвердил эти хеши с помощью HashCalc, который я скачал. Однако, когда я пытаюсь сделать то же самое для iPhone, я получаю совершенно другой хэш. Я полагаю, что это как-то связано с преобразованием изображения в байтовый массив перед вычислением хэша. Вот мой код:

- (void)imagePickerCotroller:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
[imageview setImage:image];

NSData* imageData = UIImageJPEGRepresentation(image, 1);
NSString *hash = makeSHA1(imageData);

[filepath setText: hash];
[self dismissModalViewControllerAnimated:YES];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

[self dismissModalViewControllerAnimated:YES];
}


NSString* makeSHA1(NSData *data) {       

uint8_t digest[CC_SHA1_DIGEST_LENGTH];

CC_SHA1(data.bytes, data.length, digest);    

NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];    

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", digest[i]];    
return output;
}

1 Ответ

1 голос
/ 12 марта 2012

Я подозреваю, что проблема здесь в том, что вы конвертируете данные, используя UIImageJPEGRepresentation().Даже если вы начали с данных JPEG, нет обещания, что он возвращает те же байты, с которых вы начали.

Мое (непроверенное) предложение - вы запрашиваете у CGDataProvider необработанные данные.Как то так:

CGImageRef cgImage = [image CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
CFDataRef imageData = CGDataProviderCopyData(provider);
if (imageData != NULL) {
  ...
  CFRelease(imageData);
}
...