在我的项目中,我需要在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代码给了我相同图像的不同哈希码.请告诉我可能是什么问题..
非常感谢!
有两个原因.第一个原因是原始字节→字符串→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)
归档时间: |
|
查看次数: |
1185 次 |
最近记录: |