2011-04-23 47 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作爲一個關鍵。我認爲你沒有將應用程序的任何漏洞暴露給潛在的攻擊者。如何造成傷害?

相關問題