iPhone:用于将Web图像(URL)存储为文件(哈希文件名)的快速哈希函数

5
有没有一种快速的哈希函数可用于iPhone上哈希Web URL(图像)?
我想将缓存的Web图像作为文件存储,并以哈希作为文件名,因为我认为原始的Web URL可能包含奇怪的字符,这可能会在文件系统上引起问题。
哈希函数不需要是加密的,但它绝对需要快速。
示例:
输入:http://www.calumetphoto.com/files/iccprofiles/icc-test-image.jpg 输出:3573ed9c4d3a5b093355b2d8a1468509 这是使用MD5()完成的,但由于我对此主题知之甚少,我不知道是否过度(->慢)。

既然你要将文件写入文件系统,那么几乎任何哈希算法都足够快。个人而言,我会选择用百分号转义替换/字符。 - JeremyP
1
JeremyP:这可能会使路径名过长而无法成为文件名。 - Peter Hosey
@JeremyP:嗯,在大多数情况下,我将从文件系统中加载。但你是对的。那仍然比散列要贵得多。 - znq
1
@Peter:+1,这是个好观点。我刚刚谷歌了一下HFS+,发现它的限制只有255个字符。 - JeremyP
2个回答

12

MD5算法可能已经被攻击,不再安全,但对于你描述的情况它仍然有效。这里有一个关于在iPhone上实现它的讨论串,可以查看Vroomtrap的帖子。为了记录,这是我自己版本的代码:

- (NSString *)MD5Hash {
    const char *cStr = [self UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];

    CC_MD5( cStr, strlen(cStr), result );

    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] ];
}

你需要导入CommonCrypto/CommonDigest.h头文件。


1
我发现这个链接非常有帮助:http://www.saobart.com/md5-has-in-objective-c/ - znq
我建议使用 dataUsingEncoding: 而不是 UTF8Stringstrlen 不是很快,因为它必须遍历整个字符串来找到它的末尾,才知道它有多长。NSData 对象知道数据的长度。 - Peter Hosey
欢迎您这样做。我的实证测试表明,对于中等长度的字符串(200K),使用dataUsingEncoding方法与上述方法执行效果相同,但对于大型字符串(2M)则明显更差。 - warrenm

0

我认为NSObject已经有一个哈希函数了。而且NSUrl或NSString可以重写它,你可以尝试用这些东西。我觉得在大多数情况下,它足够快速了,就像我们把NSString放入NSDictionary中一样:) NSObject hash


作为返回值,我得到一个整数值,可以将其转换为字符串并用作文件名。但是,这是否足以区分众多不同的URL?两个不同的URL生成相同的哈希值的可能性有多大? - znq
我在谷歌上找不到任何相关的文档 :(. 但是我认为如果你只有少量的URL(10-100,我只是猜测),那应该还可以。但我发现一般人都使用MD5生成哈希值,所以在使用MD5时性能可能不会是一个大问题。 - vodkhang
谢谢。我实际上检查了执行时间,MD5与[myObject hash]几乎相同。 - znq
通常情况下,不应使用此方法来存储文件,因为在NSObject的哈希函数中,冲突是相当普遍的。Apple对这种方法的冲突没有任何保证,并且我曾经尝试将其用于图像缓存哈希时引发了一个严重的崩溃。 - Tim Johnsen
@TimJohnsen 你最终使用了什么哈希函数来生成文件名? - Evan R
我通常使用MD5。 - Tim Johnsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接