Вычислить контрольную сумму на iPhone от NSData - PullRequest
17 голосов
/ 22 июня 2009

Используя iPhone SDK, пользователь выбирает изображения из средства выбора изображений. Если пользователь выбирает изображение, которое он выбрал ранее, я бы хотел, чтобы пользователь знал об этом.

Мой первоначальный план (просто чтобы убедиться, что сейчас все работает) должен сохранить изображение в файл (необходимо сделать это в любом случае по другим причинам), используя контрольную сумму NSData в качестве имени файла. Затем, когда они выберут то же изображение позже, контрольная сумма будет такой же, и поэтому я вижу, что файл с таким именем уже существует - ура!

Тем не менее, я изучил Интернет и документы Apple, чтобы узнать, как вычислить контрольную сумму из NSData. Я знаю, что могу реализовать свою собственную реализацию, но я бы предпочел избежать этого, если это возможно. Я также рад за другие идеи о том, как проверить, что два UIImage одинаковы.

EDIT

Два года назад я обещал пример кода, и вот он. Очень жаль за задержку! :)

+(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;
}

Ответы [ 2 ]

24 голосов
/ 25 января 2011

Потому что с категориями все лучше ...

Заголовок:

@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;
}
11 голосов
/ 22 июня 2009

В заголовочном файле <CommonCrypto/CommonDigest.h> должна быть функция CC_MD5, которая будет вычислять хэш MD5 произвольных данных. Это функция C, поэтому она не будет работать напрямую с NSData, но должна делать то, что вам нужно.

Еще немного информации здесь (включая оболочку с использованием NSString - должно быть достаточно легко конвертировать для использования NSData)

...