【问题标题】:MD5 not giving correct hash for online file in iOSMD5 没有为 iOS 中的在线文件提供正确的哈希值
【发布时间】:2012-05-26 10:53:13
【问题描述】:

我真的不知道这怎么可能,但我正在检查两个文件的 MD5 哈希值,所以我可以确定它们是否相同。

问题是本地文件(存储在应用程序包中的文件)给出了正确的值,而存储在在线服务器上的文件给出了错误的值。但是,如果我在 Mac 上的终端中或通过某些互联网工具检查在线文件的 md5,它会给出正确的值。

这怎么可能?

这基本上就是我正在做的。

NSData *currencyData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.iworldtip.com/appl/texts/files/CountryCurrency.plist"]];
NSData *localCurrencyData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"CountryCurrency" ofType:@"plist"]];

NSString *currencyDataHashValue = [currencyData md5];
NSString *localCurrencyDataHashValue = [localCurrencyData md5];

if (![currencyDataHashValue isEqual:localCurrencyDataHashValue]) {
            NSLog(@"Saving new version of currency plist\n\n%@ - %@", currencyDataHashValue, localCurrencyDataHashValue);
...
...

这是输出:


这是我正在使用的 md5 扩展(在网上某处找到):

.h 文件:

@interface NSString (MyExtensions)
- (NSString *) md5;
@end

@interface NSData (MyExtensions)
- (NSString*)md5;
@end

.m 文件:

#import "md5Extension.h"
#import <CommonCrypto/CommonDigest.h>

@implementation NSString (MyExtensions)
- (NSString *) md5
{
    const char *cStr = [self UTF8String];
    unsigned char result[16];
    CC_MD5( cStr, strlen(cStr), result ); // This is the md5 call
    return [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]
            ];  
}
@end

@implementation NSData (MyExtensions)
- (NSString*)md5
{
    unsigned char result[16];
    CC_MD5( self.bytes, self.length, result ); // This is the md5 call
    return [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]
            ];  
}
@end

【问题讨论】:

  • 你试过用NSLog输出currencyDatalocalCurrencyData吗?
  • 另外,服务器配置为发送 plist 文件的内容类型是什么?
  • 我不认为问题出在服务器上。因为当我尝试将 url 放入在线 md5 工具时,它给了我正确的。我没有尝试输出数据,谢谢 - 尝试一下,看看它会告诉我什么:)
  • 由于您使用 HTTP 获取文件,您可能需要检查您实际收到的内容是否与存储的内容相同。特别是,行尾和行终止符可能是一个问题,如果您使用文本(XML plist 文件),字符编码也是一个问题。如果您使用的是二进制文件(编码的 plist 文件),则没有那么多。无论哪种方式,我都会转储 iOS 设备(或模拟器)上显示的内容并比较文件以查看它们是否相同。单个字节(例如附加的行终止符)可能会导致此行为。
  • 终于让它工作了。部分原因是我的愚蠢和您的回答:D我在下面写了答案。如果您将评论写为答案,我会将其标记为正确。

标签: objective-c ios xcode md5


【解决方案1】:

所以,我发现问题出在哪里了。

首先,我很笨。我在看输出,以为问题出在远程文件上,但是本地文件给出了错误的hash!

接下来,这是由 Xcode 在编译项目时自动执行的转换引起的 - 它将 XML Plist 文件转换为 Binary Plist 文件。因此它具有不同的 MD5 哈希值。

所以最终的解决方案是将这些远程文件转换为二进制 Plist,一切都像魅力一样!


PS:我发现了一个很棒的编辑 Plist 的工具——它叫做PlistEdit Pro。 它可以用 Plist 完成您可以想象的所有事情 - 将它们转换为二进制,反之亦然...(我知道它可以通过 plutil 在终端中完成,但这是一个更方便的解决方案)

【讨论】:

  • 你知道如何让 Mac 终端产生与 Xcode 相同的哈希吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多