当大多数人谈论哈希时,他们通常会想到单向哈希,例如 SHA1、SHA2 或 MD5。虽然这些非常有用,但它们不允许您获取哈希并将其反转为原始形式。但是,它们将允许您执行诸如将用户输入的密码与他们之前输入的密码进行比较等操作,而无需存储实际密码——仅存储哈希值。
您似乎想要的是字符串压缩或通缩。幸运的是,使用 ASIHTTPRequest 类开箱即用地支持 gzip。这是this discussion中的一些使用gzip的代码。
NSString *encodedGzippedString = @"GgAAAB+LCAAAAAAABADtvQdgHEmWJSYvbcp7f0r1StfgdKEIgGATJNiQQBDswYjN5pLsHWlHIymrKoHKZVZlXWYWQMztnbz33nvvvffee++997o7nU4n99//P1xmZAFs9s5K2smeIYCqyB8/fnwfPyK+uE6X2SJPiyZ93eaX+TI9Lcuiatvx/wOwYc0HGgAAAA==";
NSData *decodedGzippedData = [NSData dataFromBase64String:encodedGzippedString];
NSData* unGzippedJsonData = [ASIHTTPRequest uncompressZippedData:decodedGzippedData];
NSString* unGzippedJsonString = [[NSString alloc] initWithData:unGzippedJsonData encoding:NSASCIIStringEncoding];
NSLog(@"Result: %@", unGzippedJsonString);
这里有一篇非常好的文章讨论了使用 MD5 进行散列:
http://cocoawithlove.com/2009/07/hashvalue-object-for-holding-md5-and.html
使用 CommonCrypto 库,已经内置了许多哈希算法。您可以像这样使用 MD5 哈希算法:
#import <CommonCrypto/CommonDigest.h>
char input[] = "Some data value.";
char result[16];
CC_MD5(input, strlen(input), result);
这将以人类可读的十六进制形式打印出散列:
printf("MD5 (\"%s\") = %02x%02x%02x%02x%02x%02x
%02x%02x%02x%02x%02x%02x
%02x%02x%02x%02x\n",
input,
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]);
如果您想了解有关只进哈希的更多信息,我在this SO answer 中发布了一些信息以及生产就绪代码。