缓存URL - 创建适当的NSString表示

时间:2012-02-07 12:39:08

标签: cocoa url caching hash nsstring

我想缓存从本地文件系统中的URL下载的图像。

我不知道的是,如何从URL创建与iOS文件系统支持的字符兼容的NSString。例如,如果我尝试在名称中创建一个:的文件,它将失败。

我应该遵循哪些步骤来创建此NSString?简单的哈希是最好的方法吗?如果是这样,我可以在iOS中使用哪种哈希例程?

2 个答案:

答案 0 :(得分:1)

我使用哈希:

  • 它将使更多可读文件名
  • 您可以避免文件名长度问题

md5应该完全适合您的目的。不幸的是,ios5-sdk只包含一个C-String函数:

CC_MD5(in, in_len, out);

该函数包含在<CommonCrypto/CommonDigest.h>中,还有其他哈希函数。

你可以找到关于如何在一个接受/返回NSString here的函数中包装它的信息。

答案 1 :(得分:0)

以下代码属于ZDS_Shared。 resolveLocalURLForRemoteURL接受远程URL并返回指向iOS文件系统上的文件的URL。文件名将是一个与原始URL不相似的字母数字字符串,但这应该不是问题。

https://github.com/ZarraStudios/ZDS_Shared/blob/master/ZSAssetManager.m#L185

- (NSURL*)resolveLocalURLForRemoteURL:(NSURL*)url
{
  if (!url) return nil;

  NSString *filename = [[url absoluteString] zs_digest];
  NSString *filePath = [[self cachePath] stringByAppendingPathComponent:filename];

  return [NSURL fileURLWithPath:filePath];
}

https://github.com/ZarraStudios/ZDS_Shared/blob/master/NSString%2BZSAdditions.m#L38

// NSString category
- (NSString*)zs_digest
{
  const char *cstr = [self cStringUsingEncoding:NSASCIIStringEncoding];
  return [[NSData dataWithBytes:cstr length:strlen(cstr)] zs_digest];
}

https://github.com/ZarraStudios/ZDS_Shared/blob/master/NSData%2BZSAdditions.m#L38

// NSData category
- (NSString*)zs_digest
{
  uint8_t digest[CC_SHA1_DIGEST_LENGTH];

  CC_SHA1([self bytes], [self length], digest);

  NSMutableString* outputHolder = [[NSMutableString alloc] initWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

  for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
    [outputHolder appendFormat:@"%02x", digest[i]];
  }

  NSString *output = [outputHolder copy];
  MCRelease(outputHolder);

  return [output autorelease];
}