2010-05-29 10 views
5

आईफोन के लिए हैश वेब यूआरएल (छवियों) के लिए एक तेज़ हैश फ़ंक्शन उपलब्ध है?आईफोन: वेब छवियों (यूआरएल) को फ़ाइलों के रूप में संग्रहीत करने के लिए तेज़ हैश फ़ंक्शन (हैश फ़ाइल नाम)

मैं कैश की गई वेब छवि को फ़ाइल नाम के रूप में हैश के साथ फ़ाइल के रूप में संग्रहीत करना चाहता हूं, क्योंकि मुझे लगता है कि कच्चे वेब यूआरएल में अजीब वर्ण हो सकते हैं जो फ़ाइल सिस्टम पर समस्याएं पैदा कर सकते हैं।

हैश फ़ंक्शन को क्रिप्टोग्राफ़िक होने की आवश्यकता नहीं है, लेकिन इसे निश्चित रूप से तेज़ होने की आवश्यकता है।

उदाहरण:

इनपुट: http://www.calumetphoto.com/files/iccprofiles/icc-test-image.jpg

आउटपुट: 3573ed9c4d3a5b093355b2d8a1468509

यह MD5() का उपयोग करके किया गया था, लेकिन बाद से मैं उस विषय मैं नहीं के बारे में ज्यादा पता नहीं है पता है कि यह अधिक है (-> धीमी)।

+0

ठीक है क्योंकि आप फ़ाइल सिस्टम में फ़ाइल लिखेंगे, बहुत ज्यादा हैशिंग एल्गोरिदम पर्याप्त तेज़ से अधिक होगा। निजी तौर पर, मैं सिर्फ/भाग के साथ/अक्षर को प्रतिस्थापित करने के लिए जाता हूं। – JeremyP

+1

जेरेमीपी: इससे फ़ाइल नाम के लिए पथनाम बहुत लंबा हो सकता है। –

+0

@ जेरेमीपी: ठीक है, ज्यादातर मामलों में मैं फाइल सिस्टम से लोड हो रहा हूं। लेकिन तुम सही हो हैशिंग की तुलना में यह अभी भी महंगा है। – znq

उत्तर

11

MD5 सुरक्षा उद्देश्यों के लिए टूटा जा सकता है, लेकिन यह आपके द्वारा वर्णित स्थिति के लिए अच्छा काम करता है। आईफोन पर इसे कार्यान्वित करने के तरीके पर Here's a thread। 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-purpose-c/ – znq

+0

मैं 'UTF8String' के बजाय' dataUsingEncoding: 'का उपयोग करने की अनुशंसा करता हूं।' strlen' सस्ता नहीं है, क्योंकि इसे अंत खोजने के लिए पूरी स्ट्रिंग चलनी हैयह जानने के लिए कि यह कितना समय है। एनएसडीटा ऑब्जेक्ट जानता है कि डेटा कितना समय है। –

+0

आप ऐसा करने के लिए उत्सुक हैं। मेरे अनुभवजन्य परीक्षण से पता चला कि डेटा यूज़िंग एन्कोडिंग का उपयोग मध्यम लंबाई (200 के) के तारों पर उपर्युक्त विधि के समान होता है और बड़े तारों (2 एम) पर काफी खराब होता है। – warrenm

0

मुझे लगता है कि एनएसओब्जेक्ट में पहले से ही हैश फ़ंक्शन है। और एनएसयूआरएल या एनएसएसटींग इसे ओवरराइड कर सकते हैं, क्या आप उन चीजों के साथ प्रयास कर सकते हैं। मुझे लगता है कि ज्यादातर मामलों में, यह पर्याप्त तेज़ है, जैसे कि हम एनएसटीटींग को NSDictionary में डालते हैं :) NSObject hash

+0

वापसी मूल्य के रूप में मुझे एक इंटीजर मान मिलता है, जिसे मैं एक स्ट्रिंग में परिवर्तित कर सकता हूं और इसे फ़ाइल नाम के रूप में उपयोग कर सकता हूं। हालांकि, क्या वह "मजबूत" है जो वहां कई अलग-अलग यूआरएल के बीच अंतर करने के लिए पर्याप्त है? यह कितनी संभावना है कि दो अलग-अलग यूआरएल एक ही हैश में परिणामस्वरूप हो? – znq

+0

मुझे इसके लिए Google पर कोई दस्तावेज़ नहीं मिल रहा है :(लेकिन मुझे लगता है कि अगर आपके पास यूआरएल की एक छोटी संख्या है (10 - 100, मैंने अनुमान लगाया है), तो यह ठीक हो सकता है। लेकिन मुझे पता चला कि आमतौर पर लोग एमडी 5 का उपयोग करते हैं हैश उत्पन्न करें, इसलिए प्रदर्शन MD5 – vodkhang

+0

धन्यवाद के साथ एक बड़ी समस्या नहीं हो सकती है। मैंने वास्तव में दोनों को निष्पादित करने के लिए समय की जांच की है, और एमडी 5 काफी कुछ है [myObject हैश] – znq

संबंधित मुद्दे