2011-04-23 16 views
1

对于我正在处理的应用程序,我有一个类处理发送给web服务的请求。为了减少流量负载,我想缓存大部分请求及其结果(至少对于不会经常改变的内容)。请求由所使用的URL唯一标识,因此我想将该URL用作关键字。iOS/Cocoa:在一个NSDictionary中使用一个URL作为关键字

在我以前的一个项目中,我曾经创建了一个URL的md5哈希函数作为一个键。我开始想知道这种方法有多安全,因为显然有两个不同的URL产生相同的哈希值的可能性很大。

任何人都可以提出一个更安全的方法,或者我应该坚持使用URL的md5哈希函数作为我的缓存字典中的键吗?

+0

MD5和“因为显然有两个不同的URL产生相同的哈希值有很大的变化”?真?请给我一个例子,我想你赢了彩票! – 2011-04-23 09:58:19

+2

为什么不使用'NSURL'对象作为字典键? – 2011-04-23 10:00:26

+0

你如何提出这些要求? ASI?还是NSURLConnections? – 2011-04-23 10:01:56

回答

2

只需使用NSMutableDictionary,其字典键的URL(如NSString s)即可。 NSDictionary(和NSMutableDictionary)几乎肯定在内部使用某种散列表实现,但它们会处理任何散列重复问题。如果你给它一个唯一的密钥,它会正确地存储它。除非你确定NSMutableDictionary对于你的需求来说太慢(这几乎肯定不会),否则你不必担心散列,碰撞或其他类似的事情。除非你确定NSMutableDictionary对于你的需求来说太慢了(它几乎肯定不会),你不需要担心散列,碰撞或类似的事情。只需使用唯一键(URL)将数据粘贴到字典中即可。

+0

是的,我坚持使用URL。我刚刚有一个脑袋。没有任何理由使用散列URL - 我只需要那些过去使用每个缓存对象的独特文件时,但目前所有对象都保存在一个文件中,因此问题实际上不存在。 – 2011-04-26 13:40:07

+0

“与字典键的URL(作为'NSStrings')”为什么?你有什么理由不直接使用'NSURL'作为密钥? – 2016-02-16 10:22:19

+0

@ErikB一个原因是,您可以使用'baseURL'和'relativeToURL'的不同组合使用'NSURL'以多种方式表示相同的绝对URL。我没有真正检查过,看看用这种方式创建的NSURL是否被认为是“平等的”,但为了避免这种可能性,使用URL规范表示(绝对字符串)可以完全避免这个问题。 – 2016-02-17 00:29:16

0

首先我建议看URL加载系统编程指南的Understanding Cache Access一章。

如果这还不够,我会坚持md5作为一个关键。我认为你没有将应用程序的任何漏洞暴露给潜在的攻击者。如何造成伤害?

相关问题