在iPhone中获取MD_5哈希文件

Sha*_*hah 4 iphone md5

在我的项目中,我需要在iphone中获取该文件的MD_5哈希码.现在我已经找到以下代码来获取任何图像/任何文件的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];
  }
Run Code Online (Sandbox Code Playgroud)

使用此代码获取图像的ByteContent,然后获取该图像字节数组字符串的md_5

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

现在我成功地获得了哈希码但是当我在网络端获得相同文件的md_5哈希码时它会给我不同的哈希码.在Web端我正在使用PHP代码

 md5_file(string $filename);
Run Code Online (Sandbox Code Playgroud)

这个PHP代码给了我不同的哈希码和iphone代码给了我相同图像的不同哈希码.请告诉我可能是什么问题..

非常感谢!

tic.png

ken*_*ytm 7

有两个原因.第一个原因是原始字节→字符串→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);
...
Run Code Online (Sandbox Code Playgroud)

第二个原因是因为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);
...
Run Code Online (Sandbox Code Playgroud)