2009-06-22 6 views
17

Utilizzando l'SDK iPhone, sto facendo in modo che l'utente selezioni le immagini dal selettore di immagini. Se l'utente seleziona un'immagine che ha selezionato in precedenza, vorrei rendere l'utente consapevole di ciò.Calcola un checksum su iPhone da NSData

Il mio piano iniziale (solo per assicurarsi che altre cose funzionino per ora) è quello di salvare l'immagine in un file (è necessario farlo comunque per altri motivi), utilizzando un checksum del NSData come nome file. Quindi, quando selezionano la stessa immagine in seguito, il checksum sarà lo stesso e quindi posso vedere che esiste già un file con quel nome - evviva!

Tuttavia, ho analizzato Internet e i documenti Apple per calcolare un checksum da un NSData. So che potrei implementare la mia implementazione, ma preferirei evitarlo, se possibile. Sono anche felice per altre idee su come verificare che due UIImages siano uguali.

EDIT

Due anni fa ho promesso un esempio di codice, ed eccolo qui. Davvero dispiaciuto per il ritardo! :)

+(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" non è un metodo dichiarato su NSData. Questo esempio di codice non funziona. : P –

risposta

11

Nel file di intestazione <CommonCrypto/CommonDigest.h> ci dovrebbe essere una funzione CC_MD5 che calcola un hash MD5 dei dati arbitrari. È una funzione C, quindi non funzionerà direttamente su un NSData, ma dovrebbe fare ciò di cui hai bisogno.

Alcuni più info here (tra cui un involucro utilizzando NSString - dovrebbe essere abbastanza facile da convertire da usare NSData)

+1

Eccellente. Una volta che torno a casa e sono in grado di farlo su NSData, inserirò di nuovo qui un esempio di codice. Grazie! – Itay

+5

oops .. deve aver dimenticato di tornare a inviare i campioni promessi. –

+2

Michael Morrison - mi hai chiamato. Risolto, due anni dopo :) – Itay

24

Perché tutto è meglio con le categorie ...

Intestazione:

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

Implementazione:

#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

Funziona come un fascino! –

+3

Questo metodo può evitare una copia extra della memoria eseguendo: CC_MD5 ([autotar], (int unsigned) [lunghezza auto], resultCString); ... invece di malloc (...)/[getBytes: ...]/CC_MD5 (...)/gratuito (...) – numist