At least there are special circumstances for which this unreliability kicks in.
Comparing [a hash] and [b hash] of two different NSString is safe when:
Otherwise every difference between the first and the middle 32 chars, as well as every difference between the middle and the last 32 characters, are not used while producing the [NSString hash] value.
For my case, the solution was pretty easy. I made use of a sha1 hash, which produced
a fingerprint from the whole string instead of pieces only. I got mine inspired by
the SHA1 method of Saurabh Sharma
lang:objc SHA1
(NSString *)sha1 { NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding]; uint8t digest[CCSHA1DIGESTLENGTH];
CC_SHA1(data.bytes, data.length, digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CCSHA1DIGEST_LENGTH * 2];
for (int i = 0; i < CCSHA1DIGEST_LENGTH; i++) { [output appendFormat:@"%02x", digest[i]]; }
return output; }
The SHA1 was for the name of a cached file, generated by giving the complete URL of the resource to be cached. Works perfect. I already filed a pull request for
http://www.makebetterthings.com/iphone/how-to-get-md5-and-sha1-in-objective-c-ios-sdk/
Calculating the md5 and sha1 hash in iOS sdk is pretty simple -
Step 1 – The very first thing you need to do is import CommonCrypto’s CommonDigest.h
#import
Step 2 – Here is the real code for calculating SHA1 and MD5 hash -
SHA1 -
-(NSString*) sha1:(NSString*)input { const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:input.length]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes, data.length, digest); NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; return output; }
MD5 -
- (NSString *) md5:(NSString *) input { const char *cStr = [input UTF8String]; unsigned char digest[16]; CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; return output; }
Hope it will help someone!!