Respuestas:
md5 está disponible en el iPhone y se puede agregar como una adición para ie NSString
y NSData
como a continuación.
MyAdditions.h
@interface NSString (MyAdditions)
- (NSString *)md5;
@end
@interface NSData (MyAdditions)
- (NSString*)md5;
@end
MyAdditions.m
#import "MyAdditions.h"
#import <CommonCrypto/CommonDigest.h> // Need to import for CC_MD5 access
@implementation NSString (MyAdditions)
- (NSString *)md5
{
const char *cStr = [self UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, (int)strlen(cStr), result ); // This is the md5 call
return [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]
];
}
@end
@implementation NSData (MyAdditions)
- (NSString*)md5
{
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5( self.bytes, (int)self.length, result ); // This is the md5 call
return [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]
];
}
@end
Agregué NSData md5 porque lo necesitaba yo mismo y pensé que este es un buen lugar para guardar este pequeño fragmento ...
Estos métodos se verifican utilizando los vectores de prueba NIST MD5 en http://www.nsrl.nist.gov/testdata/
strlen
produce la advertencia: "La conversión implícita pierde precisión entera: 'unsigned long' a 'CC_LONG' (también conocido como 'unsigned int')"
Puede usar la biblioteca de cifrado común incorporada para hacerlo. Recuerde importar:
#import <CommonCrypto/CommonDigest.h>
y entonces:
- (NSString *) md5:(NSString *) input
{
const char *cStr = [input UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
self
antes de ejecutar; si self es nulo, se estrellará.
(int)
antes, strlen
por ejemplo (int)strlen
...
Si el rendimiento es importante, puede usar esta versión optimizada. Es aproximadamente 5 veces más rápido que los que tienen stringWithFormat
o NSMutableString
.
Esta es una categoría de NSString.
- (NSString *)md5
{
const char* cStr = [self UTF8String];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);
static const char HexEncodeChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
char *resultData = malloc(CC_MD5_DIGEST_LENGTH * 2 + 1);
for (uint index = 0; index < CC_MD5_DIGEST_LENGTH; index++) {
resultData[index * 2] = HexEncodeChars[(result[index] >> 4)];
resultData[index * 2 + 1] = HexEncodeChars[(result[index] % 0x10)];
}
resultData[CC_MD5_DIGEST_LENGTH * 2] = 0;
NSString *resultString = [NSString stringWithCString:resultData encoding:NSASCIIStringEncoding];
free(resultData);
return resultString;
}
Bueno, ya que la gente pidió una versión de flujo de archivos. He modificado un pequeño fragmento hecho por Joel Lopes Da Silva que funciona con MD5, SHA1 y SHA512 Y está usando transmisiones. Está hecho para iOS pero también funciona con cambios mínimos en OSX (elimine el método ALAssetRepresentation). Puede hacer sumas de verificación para archivos dados una ruta de archivo o ALAssets (usando ALAssetRepresentation). Está agrupando datos en paquetes pequeños, lo que hace que el impacto en la memoria sea mínimo, independientemente del tamaño del archivo / tamaño del activo.
Actualmente se encuentra en github aquí: https://github.com/leetal/FileHash
Cualquier razón para no usar la implementación de Apple: https://developer.apple.com/library/mac/documentation/Security/Conceptual/cryptoservices/GeneralPurposeCrypto/GeneralPurposeCrypto.html#//apple_ref/doc/uid/TP40011172-CH9-SW1
Busque la Guía de servicios criptográficos en el sitio para desarrolladores de Apple.