Подтвердить что ты не робот

Вычислить контрольную сумму на 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;
}
4b9b3361

Ответ 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;
}