2010-01-03 16 views

उत्तर

56

ComputeHash विधि के साथ। यहाँ देखें:

ComputeHash

उदाहरण स्निपेट:

using(var cryptoProvider = new SHA1CryptoServiceProvider()) 
{ 
    string hash = BitConverter 
      .ToString(cryptoProvider.ComputeHash(buffer)); 

    //do something with hash 
} 

कहाँ बफर अपनी फ़ाइल की सामग्री है।

+4

+1 एक ही बार में एक हेक्स स्ट्रिंग उत्पन्न करने के लिए 'BitConverter' का उपयोग करने पर एक महान टिप के लिए। –

+1

SHA1CryptoServiceProvider को 'उपयोग' ब्लॉक – Mike737

+1

'लिट कनवर्टर' में लपेटा जाना चाहिए, @ mgbowen के समाधान के विपरीत एक डैश एए-एफ 0-सीसी के साथ बाइट्स को अलग करता है। वांछित क्या हो सकता है या नहीं हो सकता है। –

69
using (FileStream fs = new FileStream(@"C:\file\location", FileMode.Open)) 
using (BufferedStream bs = new BufferedStream(fs)) 
{ 
    using (SHA1Managed sha1 = new SHA1Managed()) 
    { 
     byte[] hash = sha1.ComputeHash(bs); 
     StringBuilder formatted = new StringBuilder(2 * hash.Length); 
     foreach (byte b in hash) 
     { 
      formatted.AppendFormat("{0:X2}", b); 
     } 
    } 
} 

formatted SHA-1 हैश की स्ट्रिंग प्रतिनिधित्व होता है। इसके अलावा, बाइट बफर के बजाय FileStream का उपयोग करके, ComputeHash भाग में हैश की गणना करता है, इसलिए आपको पूरी फ़ाइल को एक बार में लोड करने की आवश्यकता नहीं है, जो बड़ी फ़ाइलों के लिए उपयोगी है।

+3

हैश स्ट्रिंग बनाने की प्रक्रिया में 20 तारों को उत्पन्न करने के बजाय आपको 'स्ट्रिंगबिल्डर' का उपयोग करना चाहिए। –

+0

'फ़ाइलस्ट्रीम' 'IDISposable' है और इसका उपयोग 'उपयोग' ब्लॉक में भी किया जाना चाहिए। –

+3

स्ट्रिंगबिल्डर प्रारंभिक क्षमता हैश –

4

यदि आप पहले ही स्ट्रीम के रूप में फ़ाइल पढ़ रहे हैं, तो निम्न तकनीक हैश को गणना करते समय गणना करती है। केवल चेतावनी यह है कि आपको पूरी धारा का उपभोग करने की आवश्यकता है।

class Program 
    { 
     static void Main(string[] args) 
     { 
      String sourceFileName = "C:\\test.txt"; 
      Byte[] shaHash; 

      //Use Sha1Managed if you really want sha1 
      using (var shaForStream = new SHA256Managed()) 
      using (Stream sourceFileStream = File.Open(sourceFileName, FileMode.Open)) 
      using (Stream sourceStream = new CryptoStream(sourceFileStream, shaForStream, CryptoStreamMode.Read)) 
      { 
       //Do something with the sourceStream 
       //NOTE You need to read all the bytes, otherwise you'll get an exception ({"Hash must be finalized before the hash value is retrieved."}) 
       while(sourceStream.ReadByte() != -1);     
       shaHash = shaForStream.Hash; 
      } 

      Console.WriteLine(Convert.ToBase64String(shaHash)); 
     } 
    } 
+0

+1। यदि आप कहीं से फ़ाइल को पढ़ना चाहते हैं तो यह उपयोगी हो सकता है (उदाहरण: http अनुरोध से), इसे किसी स्थान पर लिखें (उदाहरण: डिस्क पर) और साथ ही हैश की गणना करें। – tigrou

+1

एक बड़ी फ़ाइल पर एक परीक्षण पर, इस कोड ने 'ComputeHash' समाधानों की तुलना में परिमाण के आदेशों को और भी खराब किया। हो सकता है कि यह 'रीडबेट' एक-बार-बार पढ़ रहा हो? –

+0

@MichaelKropat दिलचस्प। जानकार अच्छा लगा। 10 गुना, धीमा 100 गुना? –

0

इसके अलावा, आप की कोशिश कर सकते हैं:

FileStream fop = File.OpenRead(@"C:\test.bin"); 
string chksum = BitConverter.ToString(System.Security.Cryptography.SHA1.Create().ComputeHash(fop)); 
संबंधित मुद्दे