Caching iOS/Cocoa:使用URL作为NSDictionary中的键

Caching iOS/Cocoa:使用URL作为NSDictionary中的键,caching,nsdictionary,nsurl,Caching,Nsdictionary,Nsurl,对于我正在处理的一个应用程序,我有一个类来处理发送到Web服务的请求。为了减少流量负载,我希望缓存大多数请求及其结果(至少对于不会经常更改的内容)。请求由所使用的URL唯一标识,因此我想将URL用作密钥 在我之前的一个项目中,我曾创建URL的md5散列以用作键。我开始怀疑这种方法有多安全,因为很明显,两个不同的URL很可能产生相同的哈希值 谁能建议一种更安全的方法,或者我还是应该坚持使用URL的md5哈希作为缓存字典中的键吗?只需使用NSMutableDictionary,使用URL(作为NSS

对于我正在处理的一个应用程序,我有一个类来处理发送到Web服务的请求。为了减少流量负载,我希望缓存大多数请求及其结果(至少对于不会经常更改的内容)。请求由所使用的URL唯一标识,因此我想将URL用作密钥

在我之前的一个项目中,我曾创建URL的md5散列以用作键。我开始怀疑这种方法有多安全,因为很明显,两个不同的URL很可能产生相同的哈希值


谁能建议一种更安全的方法,或者我还是应该坚持使用URL的md5哈希作为缓存字典中的键吗?

只需使用
NSMutableDictionary
,使用URL(作为
NSString
s)作为字典键
NSDictionary
(和
NSMutableDictionary
)几乎肯定是通过某种哈希表在内部实现的,但它们会处理任何哈希重复问题。如果您给它一个唯一的密钥,它将正确地存储它


除非您确定
NSMutableDictionary
对于您的需求来说太慢(几乎肯定不会),否则您不需要担心散列、冲突或类似的问题。只需使用唯一的键(URL)将数据粘贴到字典中即可。

首先,我建议查看URL加载系统编程指南的一章


如果这还不够,我会坚持使用md5作为密钥。我认为你不会向潜在的攻击者暴露你的应用程序的任何漏洞。伤害是怎么造成的?

MD5和“显然,两个不同的URL产生相同的哈希值有很大的变化”?真正地请给我举个例子,我想你中了彩票!为什么不使用
NSURL
对象作为字典键?您是如何提出这些请求的?阿西?还是NSURLConnections?@Nick MD5容易受到碰撞攻击,尽管我同意在OP情况下不太可能发生这种情况。是的,我坚持使用URL。我只是想了想。没有任何理由使用散列URL-我只需要在过去为每个缓存对象使用不同的文件时使用这些URL,但目前所有对象都保存在一个文件中,因此问题实际上不存在。“使用字典键的URL(如
NSStrings
)”为什么?有什么理由不直接使用
NSURL
作为键吗?@ErikB一个原因是,您可以使用
NSURL
使用
baseURL
relativeToURL
的不同组合以多种方式表示同一绝对URL。实际上,我还没有检查以这种方式创建的
NSURL
s是否被认为是
equal
,但为了避免这种可能性,使用URL规范表示(绝对字符串)可以完全避免这个问题。为什么不直接将NSURL作为键使用呢?任何“可散列”NSObject都可以用作键,NSURL是。无论内部使用哪种散列,我都不在乎,我相信苹果(了解其内部结构)将为NSURL提供比我所能想到的更好的散列。