Получить MD_5 хеш файла в iPhone - PullRequest
4 голосов
/ 07 октября 2011

В моем проекте мне нужно получить хеш-код файла MD_5 в iphone.До сих пор я нашел следующий код, чтобы получить md_5 для любого изображения / любого файла.

 -(NSString *)getMD5FromString:(NSString *)source{
    const char *src = [source UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(src, strlen(src), result);
    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]
        ]lowercaseString];
  }

, используя этот код для получения ByteContent изображения, а затем получить md_5 строки байта массива этого изображения

 UIImage *image = [UIImage imageNamed:@"sf_small.png"];
 NSData *data = UIImagePNGRepresentation(image);
 NSString *str = [NSString stringWithFormat:@"%@",data];
 NSString *temp = [self getMD5FromString:str];

Теперь я успешно получаю хэш-код. Но когда на веб-странице я получаю хеш-код md_5 того же файла, он дает мне другой хэш-код.в веб-браузере я использую код PHP

 md5_file(string $filename);

этот код PHP дает мне другой хэш-код, а код iphone - другой хэш-код для одного и того же изображения.Скажите пожалуйста, в чем может быть проблема ..

Большое спасибо!

tic.png

Ответы [ 2 ]

7 голосов
/ 07 октября 2011

Есть 2 причины. Во-первых, процесс необработанных байтов → строка → UTF-8 повредил некоторые символы, не входящие в ASCII. Обратите внимание, что вы можете получить указатель на байты из NSData напрямую:

UIImage* image = [UIImage imageNamed:@"sf_small.png"];
NSData* data = UIImagePNGRepresentation(image);

const void* src = [data bytes];
NSUInteger len = [data length];
CC_MD5(src, len, result);
...

Вторая причина - PNG → необработанное изображение → процесс PNG. Нет гарантии, что одно и то же изображение будет сжато до одного и того же представления PNG в разных библиотеках, и, конечно, у вас будет другой MD5. Вы можете просто не читать файл как изображение в целом, так как можно прочитать файл напрямую как данные:

NSData* data = [NSData dataWithContentsOfFile:@"sf_small.png"];

const void* src = [data bytes];
NSUInteger len = [data length];
CC_MD5(src, len, result);
...
1 голос
/ 07 октября 2011

Вместо выхода UTF8String используйте NSMacOSRomanStringEncoding, он принимает 8-битные символы.

Лучше использовать указатель NSData без преобразования, см .: @ KennyTM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...