2009-06-22 252 views
17

使用iPhone SDK,我讓用戶從圖像選擇器中選擇圖像。如果用戶選擇他們以前選擇的圖像,我想讓用戶意識到它。從NSData計算iPhone上的校驗和

我的初始計劃(只是爲了確保其他工作現在)是將圖像保存到一個文件(無論如何因爲其他原因需要這樣做),使用NSData的校驗和作爲文件名。然後,當他們稍後選擇相同的圖像時,校驗和將是相同的,所以我可以看到具有該名稱的文件已經存在 - 歡呼!

但是,我已經搜索了互聯網和Apple文檔,以瞭解如何從NSData計算校驗和。我知道我可以實現自己的實現,但如果可能的話,我寧願避免這種情況。我也很高興看到如何檢查兩張UIImage是否相同。

編輯

兩年前,我答應了代碼示例,並在這裏。真的很抱歉延誤! :)

+(NSString*)imageIdForData:(NSData*)data 
{ 
     char* result = (char*) [[data MD5Sum] bytes]; 

     NSString* hash = [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]]; 

     return hash; 
} 
+0

「MD5Sum」不是在NSData上聲明的方法。此代碼示例不起作用。 :P – 2014-12-26 15:03:56

回答

11

<CommonCrypto/CommonDigest.h>頭文件應該有一個CC_MD5函數,將計算任意數據的MD5哈希值。這是一個C函數,所以它不會直接在NSData上工作,但它應該做你需要的。

一些更info here(包括使用的NSString的包裝 - 應該很容易轉換爲使用NSData的)

+1

優秀。一旦我回到家,我可以在NSData上做到這一點,我會在這裏回覆一個代碼示例。謝謝! – Itay 2009-06-22 19:01:24

+5

哎呀..一定忘了回到崗位承諾的樣品。 – 2010-04-27 21:12:01

24

因爲一切都與類別的更好...

頁眉:

@interface NSData (MD5) 
- (NSString *)md5String; 
@end 

執行:

#import <CommonCrypto/CommonDigest.h> 


- (NSString *)md5String 
{ 
    void *cData = malloc([self length]); 
    unsigned char resultCString[16]; 
    [self getBytes:cData length:[self length]]; 

    CC_MD5(cData, (unsigned int)[self length], resultCString); 
    free(cData); 

    NSString *result = [NSString stringWithFormat: 
         @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
         resultCString[0], resultCString[1], resultCString[2], resultCString[3], 
         resultCString[4], resultCString[5], resultCString[6], resultCString[7], 
         resultCString[8], resultCString[9], resultCString[10], resultCString[11], 
         resultCString[12], resultCString[13], resultCString[14], resultCString[15] 
         ]; 
    return result; 
}