Calcular una suma de comprobación en el iPhone desde NSData
(2)
En el archivo de encabezado <CommonCrypto/CommonDigest.h>
debe haber una función CC_MD5 que computará un hash MD5 de datos arbitrarios. Es una función de C, por lo que no funcionará directamente en un NSData, pero debería hacer lo que necesita.
Un poco más de información aquí (incluido un contenedor que usa NSString, debería ser lo suficientemente fácil de convertir para usar NSData)
Con el iPhone SDK, el usuario selecciona imágenes del selector de imágenes. Si el usuario selecciona una imagen que ha seleccionado anteriormente, me gustaría informarle al usuario.
Mi plan inicial (solo para asegurarme de que otras cosas funcionen por ahora) es guardar la imagen en un archivo (necesito hacerlo de todas formas por otras razones), usando una suma de comprobación de NSData como nombre de archivo. Luego, cuando seleccionen la misma imagen más adelante, la suma de control será la misma, por lo que puedo ver que ya existe un archivo con ese nombre: ¡hurra!
Sin embargo, he rastreado 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 me alegro por otras ideas de cómo verificar que dos UIImages sean iguales.
EDITAR
Hace dos años prometí una muestra 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;
}
Porque todo es mejor con las categorías ...
Encabezamiento:
@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;
}