2010-05-29 16 views
5

什麼是快速哈希函數可用於iPhone散列網址(圖像)?iPhone:用於將網頁圖像(網址)存儲爲文件(散列文件名)的快速哈希函數

我想將緩存的網頁圖像作爲文件存儲爲散列文件,因爲我認爲原始網址可能包含可能導致文件系統問題的奇怪字符。

散列函數不需要加密,但它肯定需要很快。

例子:

輸入:http://www.calumetphoto.com/files/iccprofiles/icc-test-image.jpg

輸出:3573ed9c4d3a5b093355b2d8a1468509

這是通過使用MD5()來完成,但因爲我不知道很多關於這個話題我不知道它是否過度殺傷( - >慢)。

+0

既然你會將文件寫入文件系統,那麼幾乎所有的哈希算法都不夠快。就個人而言,我只是用%換碼替換/字符。 – JeremyP 2010-05-29 18:47:40

+1

JeremyP:這可能會導致路徑名太長,無法顯示文件名。 – 2010-05-30 06:57:51

+0

@JeremyP:在大多數情況下,我將從文件系統加載。但你是對的。這比哈希值還要貴。 – znq 2010-05-30 09:50:12

回答

11

爲了安全起見,MD5可能會被打破,但它適用於您描述的情況。 Here's a thread關於如何在iPhone上實現它。查看Vroomtrap的帖子。對於後人,這是我自己的版本,代碼:

- (NSString *)MD5Hash { 
    const char *cStr = [self UTF8String]; 
    unsigned char result[CC_MD5_DIGEST_LENGTH]; 

    CC_MD5(cStr, strlen(cStr), result); 

    return [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
     result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], 
     result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; 
} 

你需要導入CommonCrypto/CommonDigest.h頭。

+1

我發現這裏有一個非常有用的東西:http:// www .saobart.com/md5-has-in-objective-c/ – znq 2010-05-29 16:33:08

+0

我推薦使用'dataUsingEncoding:'而不是'UTF8String'。'strlen'並不便宜,因爲它必須遍歷整個字符串才能找到結尾知道它有多長。 NSData對象知道數據的時間。 – 2010-05-30 06:52:26

+0

你很害怕這樣做。我的經驗測試表明,使用dataUsingEncoding對中等長度(200K)的字符串執行與上述方法相同的處理,對大字符串(2M)執行的處理大大變差。 – warrenm 2010-05-31 03:36:58

0

我認爲NSObject已經有一個散列函數。 NSUrl或NSString可以覆蓋它,你可以嘗試這些東西。我認爲在大多數情況下,它足夠快,就像我們將NSString放入NSDictionary中一樣:) NSObject hash

+0

作爲返回值,我得到一個Integer值,我可以將其轉換爲字符串並將其用作文件名。然而,這個「強大」足以區分不同的網站嗎?兩個不同的URL如何導致相同的散列? – znq 2010-05-29 14:32:26

+0

我找不到任何文件在谷歌那個:(但是我認爲如果你有少量的網址(10-100,我只是猜測),它可以沒問題,但我發現通常人們使用MD5來生成哈希,所以性能可能不是一個大問題,MD5 – vodkhang 2010-05-29 14:59:58

+0

謝謝。我實際上檢查了執行兩者的時間,並且MD5幾乎與[myObject hash]相同 – znq 2010-05-29 16:32:52