2009-06-22 11 views
17

Mit dem iPhone SDK, ich habe den Benutzer wählen Bilder aus der Bildauswahl. Wenn der Benutzer ein zuvor ausgewähltes Bild auswählt, möchte ich den Benutzer darauf aufmerksam machen.Berechnen Sie eine Prüfsumme auf dem iPhone von NSData

Mein erster Plan (nur um sicherzustellen, dass andere Dinge jetzt funktionieren) ist, das Bild in einer Datei zu speichern (dies muss aus anderen Gründen geschehen), indem eine Prüfsumme der NSData als Dateiname verwendet wird. Wenn sie dann später dasselbe Bild auswählen, ist die Prüfsumme gleich und so kann ich sehen, dass bereits eine Datei mit diesem Namen existiert - hurra!

Allerdings habe ich das Internet und die Apple-Dokumente für die Berechnung einer Prüfsumme aus einem NSData durchforstet. Ich weiß, dass ich meine eigene Implementierung implementieren könnte, aber ich würde es lieber vermeiden, wenn möglich. Ich bin auch glücklich für andere Ideen, wie man überprüft, dass zwei UIImagages gleich sind.

EDIT

Vor zwei Jahren habe ich versprochen, ein Codebeispiel, und hier ist es. Tut mir wirklich leid für die Verzögerung! :)

+(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" ist keine für NSData deklarierte Methode. Dieses Codebeispiel funktioniert nicht. : P –

Antwort

11

In <CommonCrypto/CommonDigest.h> Header-Datei sollte eine CC_MD5 Funktion sein, die einen MD5-Hash von beliebigen Daten berechnen werden. Es ist eine C-Funktion, also wird es nicht direkt auf einem NSData funktionieren, aber es sollte tun, was Sie brauchen.

etwas mehr info here (einschließlich einer Wrapper NSString mit - sollte einfach genug sein, um zu konvertieren NSData zu verwenden)

+1

Ausgezeichnet. Sobald ich nach Hause komme und es auf NSData machen kann, werde ich hier mit einem Codebeispiel posten. Vielen Dank! – Itay

+5

oops .. muss vergessen haben, zu den versprochenen Proben zurückzukehren. –

+2

Michael Morrison - Sie haben mich angerufen. Fixed, zwei Jahre später :) – Itay

24

Weil alles mit Kategorien besser ist ...

Rubrik:

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

Implementierung:

#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

Funktioniert wie ein Charme! –

+3

Diese Methode kann eine zusätzliche Speicherkopie vermeiden, indem Sie Folgendes tun: CC_MD5 ([Selbstbytes], (unsigned int) [Selbstlänge], resultCString); ... anstelle von malloc (...)/[getBytes: ...]/CC_MD5 (...)/frei (...) – numist