2009-06-22 12 views
17

Al usar el SDK de iPhone, el usuario selecciona imágenes del selector de imágenes. Si el usuario selecciona una imagen que haya seleccionado anteriormente, me gustaría informarle al usuario sobre ella.Calcule una suma de comprobación en el iPhone desde NSData

Mi plan inicial (solo para asegurarme de que otras cosas funcionen por ahora) es guardar la imagen en un archivo (de todos modos, necesito hacer esto por otros motivos), usando una suma de comprobación de NSData como nombre de archivo. Luego, cuando seleccionen la misma imagen más adelante, la suma de comprobación será la misma y entonces puedo ver que ya existe un archivo con ese nombre: ¡hurra!

Sin embargo, he recorrido Internet y los documentos de Apple para saber cómo calcular una suma de comprobación de un NSData. Sé que podría implementar mi propia implementación, pero preferiría evitar eso, si es posible. También estoy feliz por otras ideas sobre cómo verificar que dos UIImages sean iguales.

modificar hace

dos años me prometió un ejemplo de código, y aquí está. Realmente lo siento por el retraso! :)

+(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" no es un método declarado en NSData. Este ejemplo de código no funciona. : P –

Respuesta

11

En el archivo de cabecera <CommonCrypto/CommonDigest.h> no debería ser una función CC_MD5 que calcular un hash MD5 de datos arbitrarios. Es una función C, por lo que no funcionará directamente en un NSData, pero debería hacer lo que necesita.

Algunos más info here (incluyendo el uso de un envoltorio NSString - debe ser bastante fácil de convertir a utilizar NSData)

+1

Excelente. Una vez que llegue a casa y pueda hacerlo en NSData, volveré a publicar aquí con una muestra de código. ¡Gracias! – Itay

+5

oops .. debe haber olvidado volver a publicar las muestras prometidas. –

+2

Michael Morrison - me llamaste a eso. Reparado, dos años después :) – Itay

24

Porque todo es mejor con las categorías ...

Cabecera:

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

Implementación:

#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

¡Funciona como un encanto! –

+3

Este método puede evitar una copia de memoria extra al hacer: CC_MD5 ([auto bytes], (unsigned int) [self length], resultCString); ... en lugar de malloc (...)/[getBytes: ...]/CC_MD5 (...)/free (...) – numist

Cuestiones relacionadas