2012-03-09 28 views
1

我看到處處都找不到解決方案,我的問題。我已經爲Android和Windows編寫了一個程序,用於計算給定圖像的SHA1哈希值。我用我下載的HashCalc證實了這些哈希值。然而,當我嘗試爲iPhone做同樣的事情時,我得到了一個完全不同的散列。我相信在計算散列值之前,將圖像轉換爲字節數組有關。這裏是我的代碼:在iPhone上生成SHA1(圖片)? (不正確的結果)

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

我懷疑這裏的問題是,你使用UIImageJPEGRepresentation()轉換數據。即使你開始使用JPEG數據,也沒有承諾這會返回與你開始時完全相同的字節。

我的(未經測試的)建議是您要求CGDataProvider獲取原始數據。像這樣:

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

這也給了錯誤的散列 – silentBeep 2014-07-01 08:54:06