2011-06-27 54 views
0

在我的应用程序中,我使用每篇特定文章的URL作为关键字读取RSS提要并将它们保存到Core Data数据库。在系统周围传递这些URL可能会有问题,因为它们可能很长,我想要一种方法来生成一个唯一的标识符来存储在数据库中,然后传递它。如何从Cocoa的URL中获取唯一的哈希或ID?

我也希望它可以使用相同的字符串重构,这样如果我得到一个重复的URL,我可以从它生成标识符,并简单地检查核心数据的标识符。

是否有一个简单的方法来做到这一点?

回答

1

当大多数人谈论散列时,他们通常会考虑单向散列,如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 hasing算法等。这样的:

#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上发布了一些信息以及生产就绪代码。

0

使用SHA1(apple implementation of it on iOS),这将满足您的所有需求(以相同的输入重新运行它会产生相同的输出,在输入改变单个字符彻底的改变了输出)。