2009-06-22 3 views
17

iPhone SDK를 사용하여 사용자가 이미지 선택기에서 이미지를 선택하게합니다. 사용자가 이전에 선택한 이미지를 선택하면 사용자가이를 인식하게하고 싶습니다.NSData에서 iPhone의 체크섬 계산

내 초기 계획은 (다른 것들이 현재 작동하는지 확인하기 위해) 파일 이름으로 NSData의 체크섬을 사용하여 이미지를 파일에 저장하는 것입니다 (다른 이유 때문에이 작업을 수행해야합니다). 그런 다음 나중에 동일한 이미지를 선택하면 체크섬이 동일 해져서 해당 이름의 파일이 이미 있음을 알 수 있습니다 - 만세!

그러나 NSData에서 체크섬을 계산하는 방법에 대해서는 인터넷과 Apple 문서를 살펴 보았습니다. 내 자신의 구현을 구현할 수 있지만, 가능하면 그것을 피하기 위해 선호하는 알고 있습니다. 나는 또한 두 개의 UIImages가 같은지 확인하는 방법에 대한 다른 아이디어에 만족합니다.

편집

2 년 전 나는 코드 샘플을 약속하고, 여기 있습니다. 지연에 정말로 유감스럽게 생각합니다! :)이 <CommonCrypto/CommonDigest.h> 헤더 파일

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

답변

11

임의 데이터의 MD5 해시를 계산하는 CC_MD5 기능이 있어야한다. 이것은 C 함수이므로 NSData에서 직접 작동하지 않지만 필요한 작업을 수행해야합니다.

(있는 NSString를 사용하여 래퍼를 포함하여 -을 NSData을 사용하여 변환 할 정도로 쉬워야한다) info here 좀 더 모든 카테고리 더 나은 때문에

+1

우수. 일단 집에 돌아와 NSData에서이 작업을 수행 할 수있게되면 여기에 코드 샘플을 게시합니다. 감사! – Itay

+5

죄송합니다. 약속 한 샘플을 게시하는 것을 잊어 버렸을 것입니다. –

+2

마이클 모리슨 - 당신이 저를 불렀습니다. 고정, 2 년 후 : – Itay

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; 
} 
+0

매력처럼 작동합니다! –

+3

이 메서드는 다음을 수행하여 추가 메모리 복사본을 피할 수 있습니다. CC_MD5 ([자체 바이트], (부호없는 int) [자체 길이], resultCString); ... 대신 malloc (...)/[getBytes : ...]/CC_MD5 (...)/free (...) – numist