2012-03-09 2 views
1

나는 어디에서나 보았고 내 문제에 대한 해결책을 찾을 수 없습니다. 나는 주어진 이미지의 SHA1 해시를 계산하는 안드로이드와 윈도우 모두를위한 프로그램을 작성했다. 내가 다운로드 한 HashCalc로이 해시를 확인했다. 그러나 내가 iPhone을 위해 똑같이하려고 할 때 나는 완전히 다른 해시를 얻습니다. 해시를 계산하기 전에 이미지를 바이트 배열로 변환하는 것과 관련이 있다고 생각합니다. 내가 여기에 문제가 당신이 UIImageJPEGRepresentation()를 사용하여 데이터를 변환하고 있다는 의심iPhone에서 SHA1 (of Image)을 생성 하시겠습니까? (잘못된 결과)

- (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

: 여기 내 코드입니다. JPEG 데이터로 시작한 경우에도 시작한 바이트와 정확히 같은 바이트를 반환한다는 약속은 없습니다.

내 데이터는 CGDataProvider에 원시 데이터를 요청하는 것입니다. 다음과 같은 것 :

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

이것은 잘못된 해쉬 – silentBeep