【问题标题】:How to get a unique hash or id from a URL in Cocoa?如何从 Cocoa 中的 URL 获取唯一的哈希或 id?
【发布时间】:2011-06-27 20:48:47
【问题描述】:

在我的应用程序中,我正在阅读 RSS 提要并将它们保存到 Core Data 数据库中,使用每篇特定文章的 URL 作为键。在系统中传递这些 URL 可能会出现问题,因为它们可能很长,我想要一种方法来生成一个唯一标识符以存储在数据库中并传递它。

我还希望它可以使用相同的字符串进行重构,这样如果我得到一个重复的 URL,我可以从中生成标识符并简单地检查 Core Data 中的标识符。

有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: ios cocoa-touch


    【解决方案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 哈希算法:

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

    【讨论】:

      【解决方案2】:

      使用 SHA1 (apple implementation of it on iOS),它将满足您的所有要求(使用相同的输入重新运行它会产生相同的输出,更改输入中的单个字符会极大地改变输出)。

      【讨论】:

        【解决方案3】:

        使用像 MD5 SHA1 或 SHA256 这样的安全散列器会导致源代码在每次算法过时或一周后都必须更改散列函数。那么使用自动化审计工具的公司将拒绝具有这些功能的源代码。

        因此,如果您需要一个哈希函数来仅从 url 中删除特殊字符,那么使用自定义哈希比这些安全哈希之一更好。

        【讨论】:

          猜你喜欢
          • 2021-07-29
          • 1970-01-01
          • 1970-01-01
          • 2015-10-17
          • 2013-07-29
          • 2010-09-15
          • 2015-05-17
          • 2010-12-19
          • 1970-01-01
          相关资源
          最近更新 更多