gpt4 book ai didi

iphone - ALAssetRepresentation 图像的 MD5 散列与复制的 ALAssetRepresentation 图像的散列不匹配

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:18:21 25 4
gpt4 key购买 nike

我正在使用以下内容从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com