2010-10-01 7 views
6

के प्रदर्शन में सुधार करें मैं ठीक से काम करने वाली फ़ाइल के चेकसम करने के लिए निम्न कोड का उपयोग कर रहा हूं। लेकिन जब मैं एक बड़ी फाइल के लिए हैश उत्पन्न करता हूं, तो 2 जीबी कहें, यह काफी धीमी है। मैं इस कोड के प्रदर्शन में सुधार कैसे कर सकता हूं?SHA-1 ComputeHash

fs = new FileStream(txtFile.Text, FileMode.Open); 
     formatted = string.Empty; 
     using (SHA1Managed sha1 = new SHA1Managed()) 
     { 
      byte[] hash = sha1.ComputeHash(fs); 

      foreach (byte b in hash) 
      { 
       formatted += b.ToString("X2"); 
      } 
     } 
     fs.Close(); 

अद्यतन:

सिस्टम:

ओएस: विन 7 64 बिट, सीपीयू: I5 750, राम: 4GB, HDD: 7200rpm

टेस्ट:

टेस्ट 1 = 59.895 सेकेंड

टेस्ट 2 = 59.9 4 सेकंड

+1

+1 केवल भारी बिट के प्रदर्शन में सुधार करने की कोशिश करने के लिए, और स्वरूपित नहीं है कि स्वरूपित एक अपेक्षाकृत अक्षम तरीके से बनाया गया है :) –

+0

:) शायद इसे स्ट्रिंगबिल्डर में बदलना चाहिए? –

+0

अब आह, आप खुद को उस +1 से बाहर कर रहे हैं! क्या सार्थक हो सकता है यद्यपि यदि आप ऐसे हेक्स स्ट्रिंग का उत्पादन करते हैं तो अक्सर ऐसा करने की विधि होती है जो यह करता है (एक विस्तार विधि के लिए अच्छा मामला)। इसके बाद संभावित रूप से कहीं भी इसका उपयोग किया जा रहा है जहां प्रदर्शन अधिक वास्तविक अंतर बनाएगा, यह स्ट्रिंगबिल्डर (उचित क्षमता पर बनाए गए) या निश्चित आकार के चार सरणी दृष्टिकोणों को आगे ले जाने के लिए अधिक उपयुक्त होगा। –

उत्तर

3

पहला प्रश्न यह है कि आपको इस चेकसम के लिए क्या चाहिए। यदि आपको क्रिप्टोग्राफिक गुणों की आवश्यकता नहीं है, तो एक गैर-क्रिप्टोग्राफ़िक हैश, या हैश जो कम क्रिप्टोग्राफ़िक रूप से सुरक्षित है (MD5 "टूटा हुआ" होने से यह एक अच्छा हैश नहीं है, और न ही कुछ उपयोगों के लिए पर्याप्त मजबूत है) अधिक प्रदर्शन करने की संभावना है। आप डेटा के सबसेट को पढ़ कर अपना खुद का हैश बना सकते हैं (मैं अंतर्निहित फ़ाइल के 4096byte भाग में इस सबसेट काम को बनाने की सलाह दूंगा, क्योंकि वह SHA1Managed द्वारा उपयोग किए गए बफर आकार से मेल खाता है और साथ ही तेज़ चंक पढ़ने की अनुमति देता है यदि आप एक्स के कुछ मूल्य के लिए हर एक्स बाइट्स कहते हैं तो आप करेंगे)।

संपादित करें: इस उत्तर के बारे में मुझे याद दिलाने वाला एक उत्साह ने मुझे यह भी याद दिलाया है कि मैंने SpookilySharp लिखा है जो उच्च प्रदर्शन 32-, 64- और 128-बिट हैश प्रदान करता है जो क्रिप्टोग्राफिक नहीं हैं, लेकिन त्रुटियों के विरुद्ध चेकसम प्रदान करने के लिए अच्छा है , भंडारण, आदि। (बदले में यह मुझे याद दिलाता है कि मुझे इसे .NET कोर का समर्थन करने के लिए अद्यतन करना चाहिए)।

बेशक, यदि आप फ़ाइल के SHA-1 को किसी अन्य चीज़ के साथ इंटरऑपरेट करना चाहते हैं, तो आप अटक गए हैं।

मैं विभिन्न बफर आकारों के साथ प्रयोग करता हूं, क्योंकि फाइलस्ट्रीम के बफर के आकार में वृद्धि अतिरिक्त स्मृति की लागत पर गति बढ़ा सकती है। मैं 4096 (4096 डिफ़ॉल्ट, आकस्मिक रूप से) के पूरे बहुमत की सलाह दूंगा क्योंकि SHA1Managed एक समय में 4096 भाग मांगेगा, और इस तरह कोई ऐसा मामला नहीं होगा जहां फ़ाइलस्ट्रीम सबसे अधिक पूछे जाने वाले से कम लौटाए (अनुमति दें लेकिन कभी-कभी suboptimal) या एक समय में एक से अधिक प्रतिलिपि करता है।

+0

+1। कभी-कभी हम गलत समस्या को हल कर रहे हैं। –

+0

धन्यवाद। एमडी 5 के साथ जाने का फैसला किया क्योंकि मैं केवल ट्रांसमिशन के बाद फाइलों की अखंडता की जांच कर रहा था और एसएचए -1 की अतिरिक्त सुरक्षा की आवश्यकता नहीं थी। जिज्ञासा से बाहर। मैंने एसएसई 3 निर्देशों का उपयोग करके इंटेल के एसएचए -1 के नए कार्यान्वयन को पाया। http://software.intel.com/en-us/articles/improving-the-performance-of-the-secure-hash-algorithm-1/ बस सोच रहा है कि प्रबंधित कोड में इसका उपयोग कैसे किया जा सकता है? –

1

अच्छा, क्या यह आईओ-बाउंड या सीपीयू-बाध्य है? अगर यह सीपीयू-बाध्य है, तो हम इसके बारे में बहुत कुछ नहीं कर सकते हैं।

ऐसा नहीं है कि विभिन्न मापदंडों के साथ FileStream खोलने अधिक बफरिंग करते हैं या मानते हैं कि आप फ़ाइल क्रमिक रूप से पढ़ने के लिए जा रहे हैं करने के लिए फाइल सिस्टम की अनुमति होगी संभव है - लेकिन मुझे शक है कि बहुत मदद मिलेगी बहुत। (यह निश्चित रूप से बहुत कुछ नहीं करने जा रहा है यदि यह सीपीयू-बाध्य है।)

वैसे भी धीमा "धीमा" कितना धीमा है? फ़ाइल की प्रतिलिपि बनाकर, कहें?

यदि आपके पास बहुत मेमोरी है (उदा। 4 जीबी या अधिक) फाइल को दूसरी बार हैश फ़ाइल में कैश में हो सकता है, तो यह कितनी देर तक फ़ाइल सिस्टम कैश में हो सकता है?

+0

मैंने कुछ गति परीक्षण चलाए हैं। मेरा अपडेट जांचें। इसके अलावा सीपीयू उपयोग केवल 30% पर चोटी। –

+1

@ ब्रूस: कुल में 30%? कितने कोर से बाहर? यदि यह एक बहु-कोर सीपीयू है लेकिन एक एकल थ्रेडेड हैशिंग एल्गोरिदम है, तो यह अभी भी सीपीयू-बाध्य हो सकता है। कार्य प्रबंधक के प्रदर्शन टैब को यह देखने के लिए देखें कि क्या एक सीपीयू पूरे समय के लिए pegged है :) –

+0

नहीं, सभी 4 कोर औसत 5-6% पर औसत। 2 कोर कुछ काम कर रहे हैं लेकिन कहीं भी pegged के पास। निश्चित रूप से आईओ-बाध्य सही? –

1

सबसे पहले, क्या आपने "काफी धीमी" माप ली है? this site से, SHA-1 में लगभग 100 एमबी/एस (सीपीयू के आधार पर) के साथ एमडी 5 की आधा गति है, इसलिए 2 जीबी में हैश के लिए लगभग 20 सेकंड लगेंगे। साथ ही, ध्यान दें कि यदि आप एक धीमी एचडीडी का उपयोग कर रहे हैं, तो यह आपकी असली बाधा हो सकती है क्योंकि 30-70 एमबी/एस असामान्य नहीं हैं।

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

1

पहला: गैर-प्राचीन CPUs पर SHA-1 फ़ाइल हैशिंग I/O होना चाहिए - और I5 निश्चित रूप से प्राचीन के रूप में योग्य नहीं है। बेशक यह एसएचए -1 के कार्यान्वयन पर निर्भर करता है, लेकिन मुझे संदेह है कि SHA1Managed über-slow है।

अगला, 2 जीबी डेटा के लिए 60sec ~ 34 एमबी/एस है - हार्डडिस्क पढ़ने के लिए धीमा है; यहां तक ​​कि एक 2.5 "लैपटॉप डिस्क उस से तेज़ी से पढ़ सकती है। हार्डड्राइव मानना ​​आंतरिक है (कोई यूएसबी 2/जो भी या नेटवर्क बाधा नहीं है), और वहां कई अन्य डिस्क I/O गतिविधि नहीं है, मुझे आश्चर्य होगा कि 60 एमबी से कम/एक आधुनिक ड्राइव से पढ़ रहा है।

मेरे अनुमान होगा कि ComputeHash() एक छोटा सा बफर आंतरिक रूप से उपयोग करता है। मैन्युअल रूप से प्रयास करें पढ़ने/हैशिंग है, तो आप एक बड़ा बफर (64KB या भी बड़ा) प्रवाह क्षमता को बढ़ाने के लिए निर्दिष्ट कर सकते हैं। आप यह भी तो डिस्क पढ़ सकते हैं और गणना ओवरलैप जा सकती है async प्रसंस्करण के लिए ले जाने के कर सकते हैं।

-1

आप मैं जावा में यह उपयोग कर रहा था हो रही है SHA-1 मूल्य के लिए इस तर्क का उपयोग कर सकते। ।

0,123,

सार्वजनिक वर्ग sha1Calculate {

public static void main(String[] args)throws Exception 
    { 
     File file = new File("D:\\Android Links.txt"); 
     String outputTxt= ""; 
     String hashcode = null; 

     try { 

      FileInputStream input = new FileInputStream(file); 

      ByteArrayOutputStream output = new ByteArrayOutputStream(); 
      byte [] buffer = new byte [65536]; 
      int l; 

      while ((l = input.read (buffer)) > 0) 
       output.write (buffer, 0, l); 

      input.close(); 
      output.close(); 

      byte [] data = output.toByteArray(); 


       MessageDigest digest = MessageDigest.getInstance("SHA-1"); 

      byte[] bytes = data; 

      digest.update(bytes, 0, bytes.length); 
      bytes = digest.digest(); 

      StringBuilder sb = new StringBuilder(); 

      for(byte b : bytes) 
      { 
       sb.append(String.format("%02X", b)); 
      } 

       System.out.println("Digest(in hex format):: " + sb.toString()); 


     }catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 
0

न तो बड़े इनपुट स्ट्रिंग्स के लिए सबसे अच्छा विकल्प SHA1Managed है, न ही Byte.ToString है ("X2") सबसे तेज़ तरीका एक स्ट्रिंग के लिए बाइट सरणी परिवर्तित करने के लिए।

मैंने अभी उस विषय पर विस्तृत बेंचमार्क के साथ एक लेख समाप्त किया है। यह SHA1Managed, SHA1CryptoServiceProvider, SHA1Cng की तुलना करता है और विभिन्न लंबाई इनपुट स्ट्रिंग्स पर SHA1.Create() को भी मानता है।

दूसरे भाग में, यह बाइट सरणी को स्ट्रिंग करने के 5 अलग-अलग तरीकों को दिखाता है जहां बाइट.ओस्ट्रिंग ("एक्स 2") सबसे खराब है।

मेरा सबसे बड़ा इनपुट केवल 10,000 वर्ण था ताकि आप अपनी 2 जीबी फ़ाइल पर अपने बेंचमार्क चला सकें। अगर यह संख्याओं को कैसे बदलता है तो यह काफी दिलचस्प होगा।

http://wintermute79.wordpress.com/2014/10/10/c-sha-1-benchmark/

हालांकि, फ़ाइल अखंडता जांच के लिए आप MD5 का उपयोग कर के रूप में आप पहले से ही लिखा से बेहतर कर रहे हैं।

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