2009-06-22 7 views
17

Korzystając z iPhone SDK, wybieram użytkownika z obrazka z selektora obrazu. Jeśli użytkownik wybierze wcześniej wybrany obraz, chciałbym poinformować o tym użytkownika.Oblicz sumę kontrolną na telefonie iPhone od NSData

Mój początkowy plan (aby upewnić się, że na razie działają inne rzeczy) to zapisanie obrazu do pliku (trzeba to zrobić z innych powodów), używając sumy kontrolnej NSData jako nazwy pliku. Następnie, gdy później wybiorą ten sam obraz, suma kontrolna będzie taka sama, więc widzę, że plik o tej nazwie już istnieje - hurra!

Przeszukałem jednak Internet i dokumenty Apple'a, aby dowiedzieć się, jak obliczyć sumę kontrolną z NSData. Wiem, że mógłbym wdrożyć własną implementację, ale wolałbym tego uniknąć, jeśli to możliwe. Cieszę się również z innych pomysłów, jak sprawdzić, czy dwie jednostki UII są takie same.

EDIT

Dwa lata temu obiecałem próbkę kodu, a tu jest. Naprawdę przepraszam za opóźnienie! :)

+(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" nie jest metodą zadeklarowaną w NSData. Ten przykładowy kod nie działa. : P –

Odpowiedz

11

W pliku <CommonCrypto/CommonDigest.h> nagłówka nie powinno być funkcją CC_MD5 że będzie obliczyć hash MD5 dowolnych danych. Jest to funkcja C, więc nie będzie działać bezpośrednio na NSData, ale powinna zrobić to, czego potrzebujesz.

Niektóre bardziej info here (w tym owijki z wykorzystaniem NSString - powinno być dość łatwo przekształcić w użyciu NSData)

+1

Doskonały. Gdy wrócę do domu i będę mógł to zrobić na NSData, opublikuję tutaj z próbką kodu. Dzięki! – Itay

+5

oops .. musiał zapomnieć wrócić do postu obiecanej próbki. –

+2

Michael Morrison - wezwałeś mnie na to. Naprawiono, dwa lata później :) – Itay

24

Ponieważ wszystko jest lepiej z kategorii ...

Header:

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

Implementacja:

#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

Działa jak urok! –

+3

Ta metoda pozwala uniknąć dodatkowej kopii pamięci wykonując: CC_MD5 ([self bytes], (unsigned int) [self length], resultCString); ... zamiast malloc (...)/[getBytes: ...]/CC_MD5 (...)/za darmo (...) – numist