我想缓存从本地文件系统中的URL下载的图像。
我不知道的是,如何从URL创建与iOS文件系统支持的字符兼容的NSString
。例如,如果我尝试在名称中创建一个:
的文件,它将失败。
我应该遵循哪些步骤来创建此NSString
?简单的哈希是最好的方法吗?如果是这样,我可以在iOS中使用哪种哈希例程?
答案 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];
}