在我的应用程序中,我正在读取RSS提要,并使用每个特定文章的URL作为键将它们保存到核心数据数据库中。在系统中传递这些URL可能会有问题,因为它们可能会很长,我希望有一种方法可以生成一个唯一的标识符存储在数据库中,然后将其传递出去。
我还希望它是可重构的,使用相同的字符串,这样如果我得到一个重复的URL,我可以从它生成标识符,并简单地检查核心数据的标识符。
有什么简单的方法可以做到这一点吗?
发布于 2011-08-31 21:50:43
当大多数人谈论哈希时,他们通常想到的是单向哈希,如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中发布了一些信息以及可用于生产的代码。
发布于 2011-06-28 05:01:28
使用SHA1 (apple implementation of it on iOS),它将满足您的所有需求(使用相同的输入重新运行它将生成相同的输出,更改输入中的单个字符将极大地更改输出)。
发布于 2020-11-26 17:07:52
使用像MD5、SHA1或SHA256这样的安全散列程序会导致源代码在每次算法变得过时或变得过时时都必须更改散列函数。然后,使用自动审计工具的公司将拒绝具有这些功能的源代码。
因此,如果您需要一个hasher函数来仅从urls中删除特殊字符,那么自定义hasher要比那些安全hasher中的一个更好。
https://stackoverflow.com/questions/6498786
复制相似问题