Вычислить контрольную сумму на iPhone из NSData
Используя iPhone SDK, у меня есть пользователь, который выбирает изображения из подборщика изображений. Если пользователь выбирает ранее выбранное изображение, я хотел бы сообщить пользователю об этом.
Мой первоначальный план (только для того, чтобы убедиться, что другие вещи работают сейчас) заключается в том, чтобы сохранить изображение в файл (необходимо сделать это в любом случае по другим причинам), используя контрольную сумму NSData в качестве имени файла. Затем, когда они выберут одно и то же изображение позже, контрольная сумма будет такой же, и я вижу, что файл с таким именем уже существует - ура!
Однако я просмотрел интернет и документы Apple о том, как вычислить контрольную сумму из NSData. Я знаю, что могу реализовать свою собственную реализацию, но я бы предпочел избежать этого, если это возможно. Я также рад за другие идеи о том, как проверить, что два UIImages одинаковы.
ИЗМЕНИТЬ
Два года назад я пообещал образец кода, и вот он. Очень жаль за задержку!:)
+(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;
}
Ответы
Ответ 1
В заголовочном файле <CommonCrypto/CommonDigest.h>
должна быть функция CC_MD5, которая будет вычислять хеш MD5 произвольных данных. Это функция C, поэтому она не будет работать непосредственно с NSData, но она должна делать то, что вам нужно.
Еще несколько информация здесь (включая обертку с использованием NSString - должно быть достаточно легко конвертировать для использования NSData)
Ответ 2
Потому что все лучше с категориями...
Заголовок:
@interface NSData (MD5)
- (NSString *)md5String;
@end
Реализация:
#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;
}