在我的应用程序中,我正在阅读RSS源并使用每个特定文章的URL作为密钥将它们保存到Core Data数据库。在系统中传递这些URL可能会有问题,因为它们可能很长,而且我想要一种方法来生成一个唯一的标识符来存储在数据库中并传递它。
我也希望它可以使用相同的字符串进行重构,这样如果我得到一个重复的URL,我就可以从中生成标识符,只需检查Core Data中的标识符。
有一种简单的方法吗?
答案 0 :(得分:2)
当大多数人谈论哈希时,他们通常会考虑像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中发布了一些信息以及生产就绪代码。
答案 1 :(得分:0)
使用SHA1(apple implementation of it on iOS),它将满足您的所有要求(使用相同的输入重新运行它会生成相同的输出,更改输入中的单个字符会大大改变输出)。
答案 2 :(得分:0)
使用像MD5 SHA1或SHA256这样的安全散列会导致源代码,该源代码每次算法过时或一周都必须更改哈希函数。然后,使用自动审核工具的公司将拒绝具有这些功能的源代码。
因此,如果您需要一个哈希函数来仅从URL中删除特殊字符,那么最好使用自定义哈希来比这些安全哈希中的一个更好。