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

时间:2011-09-19 22:32:41

标签: 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方法贵得多。

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:3)

不同之处在于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秒。