5
votes

What is a fast hash function available for the iPhone to hash web urls (images)?

I'd like to store the cached web image as a file with a hash as the filename, because I suppose the raw web url could contain strange characters that could cause problems on the file system.

The hash function doesn't need to be cryptographic, but it definitely needs to be fast.

Example:

Input: http://www.calumetphoto.com/files/iccprofiles/icc-test-image.jpg

Output: 3573ed9c4d3a5b093355b2d8a1468509

This was done by using MD5(), but since I don't know much about that topic I don't know if it is overkill (-> slow).

2
Well since you'll be writing the file to a file system, pretty much any hashing algorithm will be more than fast enough. Personally, I'd just go for replacing the / characters with percent escapes.JeremyP
JeremyP: That may make the pathname too long for a filename.Peter Hosey
@JeremyP: well, in the most cases I will be loading from the file system. But you're right. That's still way more expensive than the hashing.znq
@Peter: +1 that's a good point. Just googled HFS+ and the limit is only 255 characters.JeremyP

2 Answers

12
votes

MD5 may be broken for security purposes, but it works well for the situation you describe. Here's a thread on how to implement it on iPhone. Check out Vroomtrap's post. For posterity, here's my own version of that code:

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

You'll need to import the CommonCrypto/CommonDigest.h header.

0
votes

I think the NSObject already has a hash function. And NSUrl or NSString can override it, can you try with those things. I think in most of cases, it is fast enough, like we put NSString into NSDictionary:) NSObject hash