區別在於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.008秒。
我想我們需要得到「標題」的偏移量。 –