iphone - ALAssetRepresentation 图像的 MD5 哈希值与重复的 ALAssetRepresentation 图像的哈希值不匹配

标签 iphone ios ios4 alassetslibrary

我使用以下命令从 ALAssetRepresentation 创建 NSData 对象,以导出图像文件并从中创建 md5 哈希:

- (NSUInteger)getBytes:(uint8_t *)buffer fromOffset:(long long)offset length:(NSUInteger)length error:(NSError **)error;

当我重新添加导出的文件并执行相同的操作时,文件的 md5 哈希值不同。

当我使用 UIImagePNGRepresentation() 创建 NSData 对象并执行上述操作时,md5 哈希值匹配。

我试图避免使用 UIImagePNGRepresentation(),因为对于我正在做的事情来说,它比 getsBytes 方法要昂贵得多。

任何想法将不胜感激!

最佳答案

不同之处在于 UIImagePNGRepresentation() 仅返回图像数据并忽略文件头。

问题是您可能从偏移量 0 开始。这将读取文件头,这会扰乱您的散列(因为它们可能是相同的图像,但创建日期不同)。

下面是从文件中间读取 1K 的示例。对于图像,这只会读取大约 340 像素,因此如果您要比较图像是否重复,您可能需要将比较大小增加到大约 20K 或更大。

代码如下:

    #import <CommonCrypto/CommonCrypto.h>
    #define HASH_DATA_SIZE  1024  // Read 1K of data to be hashed

    ...

    ALAssetRepresentation *rep = [anAsset defaultRepresentation];
    Byte *buffer = (Byte *) malloc(rep.size);
    long long offset = rep.size / 2; // begin from the middle of the file
    NSUInteger buffered = [rep getBytes:buffer fromOffset:offset length:HASH_DATA_SIZE error:nil];

    if (buffered > 0)
    {
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]

        unsigned char result[CC_MD5_DIGEST_LENGTH];

        CC_MD5([data bytes], [data length], result);
        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]
                        ];

        NSLog(@"Hash for image is %@", hash);
    }

我尝试了大约 4000 张照片。使用 UIImagePNGRepresentation() 时完整图像的平均哈希时间为 0.008 秒,而当比较从文件中间读取的每张图像的 1K 时,该时间降至约 0.00008 秒。

关于iphone - ALAssetRepresentation 图像的 MD5 哈希值与重复的 ALAssetRepresentation 图像的哈希值不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478085/

相关文章:

iphone - 隐藏 ADBannerView。把它移到屏幕外可以吗?

iphone - 向上滚动时使 UIScrollView 中的 UIView 保持在顶部

ios - UIFeedback 触觉引擎被调用的次数比被激活的次数多

ios - Mapview nil 关闭,在 StackO 上看到了主题。但没有帮助我

ios - 按下 UIButton 时运行函数

iphone - UIActivityIndi​​catorView 用于为 URL 加载的 UIImage

iphone - 如何将 UIImage 和 UILabel 合并为一张图片并保存

iphone - ABAddressBookCopyArrayOfAllPeople 和 ABAddressBookGetPersonCount 返回不同的大小

iphone - 在iphone sdk中将文件夹从资源复制到文档

iphone - iOS 4.* 中的方法 isBeingPresented