Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPhone: fast hash function for storing web images (url) as files (hashed filenames)

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).

like image 945
znq Avatar asked May 29 '10 11:05

znq


People also ask

Can you hash a URL?

In a URL, a hash mark, number sign, or pound sign ( # ) points a browser to a specific spot in a page or website. It is used to separate the URI of an object from a fragment identifier. When you use a URL with a # , it doesn't always go to the correct part of the page or website.

How do you create a hash URL?

To compute the hash prefix of a URL, follow these steps: Canonicalize the URL (see Canonicalization). Create the suffix/prefix expressions for the URL (see Suffix/Prefix Expressions). Compute the full-length hash for each suffix/prefix expression (see Hash Computations).

What hash function does Ipfs use?

In practice, content addressing systems on the web such as IPFS use cryptographic hashing functions to create fingerprints. Basically, we take the raw content (in this case, a cat photo), and run that data through a hash function, to produce a digest.


1 Answers

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.

like image 55
warrenm Avatar answered Oct 03 '22 10:10

warrenm