2011-09-19 195 views
2

我使用下面從一個ALAssetRepresentation創建一個NSData對象都導出圖像文件,以及創建一個MD5哈希:MD5哈希值不匹配重複ALAssetRepresentation圖像的哈希

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

當我重新添加導出的文件並執行相同的操作時,該文件的md5哈希是不同的。

當我使用UIImagePNGRepresentation()創建NSData對象並執行上述操作時,md5散列匹配。

我試圖避免使用UIImagePNGRepresentation(),因爲它比getsBytes方法更昂貴。

任何想法,將不勝感激!

回答

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.008秒。

+0

我想我們需要得到「標題」的偏移量。 –