2010-09-02 15 views
14

के लिए हैश बनाना, मुझे फ़ोल्डर के लिए हैश बनाने की आवश्यकता है, जिसमें कुछ फ़ाइलें हैं। मैंने पहले से ही प्रत्येक फाइल के लिए यह कार्य किया है, लेकिन मैं फ़ोल्डर में सभी फ़ाइलों के लिए एक हैश बनाने का तरीका खोज रहा हूं। कोई विचार यह कैसे करना है?फ़ोल्डर

(निश्चित रूप से मैं प्रत्येक फ़ाइल के लिए हैश बना सकते हैं और कुछ बड़े हैश करने के लिए इसे जोड़ लेकिन यह मुझे पसंद है एक तरीका नहीं है सकते हैं)

अग्रिम धन्यवाद।

उत्तर

1

एक बड़ी स्ट्रिंग और हैश में फाइलनाम और फाइल सामग्री को संगत करें, या प्रदर्शन के लिए भाग में हैशिंग करें।

सुनिश्चित करें कि आप खाते में कुछ चीजें लेने की जरूरत:

  • आप तो आप दो अलग अलग हैश मामले आदेश परिवर्तन फ़ाइलें में नहीं मिलता है, नाम से फ़ाइलें क्रमबद्ध की जरूरत है।
  • इस विधि का उपयोग करके आप केवल फ़ाइल नाम और सामग्री को ध्यान में रखते हैं। यदि फ़ाइल नाम की गणना नहीं की जाती है तो आप पहले सामग्री द्वारा सॉर्ट कर सकते हैं, हैश, यदि अधिक विशेषताएँ (ctime/mtime/hidden/archived ..) मायने रखती हैं, तो उन्हें-टू-शेड स्ट्रिंग में शामिल करें।
+0

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

+0

मुझे याद है कि सी # हैशर्स के पास उन्हें टुकड़ों के साथ खिलाने के लिए एक समारोह था, और अंत में आप अंतिम हैश प्राप्त करने के लिए कह सकते हैं, यह सुनिश्चित नहीं कर सकते कि ये कार्य/कक्षाएं क्या थीं। उनके साथ आप मेमोरी में अपनी पसंद के तरीके को सॉर्ट कर सकते हैं, फिर लूप फाइलें और लोड सौ कुछ सौ केबी में लोड कर सकते हैं और इसे हैशर को खिला सकते हैं, इस तरह आपको ज्यादा मेमोरी की आवश्यकता नहीं है लेकिन फिर भी, हैशिंग के लिए कुछ समय लगेगा, जो कुछ है जिसे आप छुटकारा नहीं पा सकते हैं। रचनात्मक सोच के लिए – aularon

1

यदि आपके पास पहले से ही सभी फाइलों के लिए हैश है, तो हैश को वर्णानुक्रम में क्रमबद्ध करें, उन्हें संयोजित करें और उन्हें फिर से उबेर हैश बनाने के लिए हैश करें।

7

फ़ाइलों की टैरबॉल बनाएं, हैश टैरबॉल बनाएं।

> tar cf hashes *.abc 
> md5sum hashes

या हैश कमांड में व्यक्तिगत फाइलें और पाइप आउटपुट हैश।

> md5sum *.abc | md5sum

संपादित करें: दोनों दृष्टिकोण से ऊपर फ़ाइलों को क्रमबद्ध नहीं है इसलिए प्रत्येक मंगलाचरण के लिए अलग हैश वापस आ सकते हैं, कैसे खोल तारक फैलता है पर निर्भर करता है।

+0

+1 – Paedow

+0

+1 यह वास्तव में सीधे आगे दृष्टिकोण है :) –

+0

यह एकमात्र उत्तर है जो * सभी * मेटा सूचना जैसे दिनांक, एक्सेस अधिकार, यूआईडी, गाइड, ... – itsafire

23

यह सभी फ़ाइल (सापेक्ष) पथ और सामग्री को हैश करता है, और सही ढंग से फ़ाइल ऑर्डरिंग को संभालता है।

और यह 4 एमबी निर्देशिका के लिए 30 एमएम की तरह त्वरित है।

using System; 
using System.Text; 
using System.Security.Cryptography; 
using System.IO; 
using System.Linq; 

... 

public static string CreateMd5ForFolder(string path) 
{ 
    // assuming you want to include nested folders 
    var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories) 
         .OrderBy(p => p).ToList(); 

    MD5 md5 = MD5.Create(); 

    for(int i = 0; i < files.Count; i++) 
    { 
     string file = files[i]; 

     // hash path 
     string relativePath = file.Substring(path.Length + 1); 
     byte[] pathBytes = Encoding.UTF8.GetBytes(relativePath.ToLower()); 
     md5.TransformBlock(pathBytes, 0, pathBytes.Length, pathBytes, 0); 

     // hash contents 
     byte[] contentBytes = File.ReadAllBytes(file); 
     if (i == files.Count - 1) 
      md5.TransformFinalBlock(contentBytes, 0, contentBytes.Length); 
     else 
      md5.TransformBlock(contentBytes, 0, contentBytes.Length, contentBytes, 0); 
    } 

    return BitConverter.ToString(md5.Hash).Replace("-", "").ToLower(); 
} 
+0

वास्तव में बहुत अच्छा है –

+0

यदि आप कभी भी स्थानीय सुरक्षा नीति के साथ किसी सर्वर पर इसे तैनात करते हैं, तो FIPS अनुपालन – SkeetJon

+0

@ स्केकेट जोन तकनीक किसी भी क्रिप्टो एल्गोरिदम के लिए समान है ताकि आप FIPS मशीनों के लिए SHA को प्रतिस्थापित कर सकें। –

9

डंक का उत्तर अच्छी तरह से काम करता है; हालांकि, यह एक खाली निर्देशिका को संभाल नहीं करता है। नीचे दिया गया कोड एक खाली निर्देशिका के लिए MD5 'd41d8cd98f00b204e9800998ecf8427e' (0 लंबाई वर्ण स्ट्रीम के लिए MD5) देता है।

public static string CreateDirectoryMd5(string srcPath) 
{ 
    var filePaths = Directory.GetFiles(srcPath, "*", SearchOption.AllDirectories).OrderBy(p => p).ToArray(); 

    using (var md5 = MD5.Create()) 
    { 
     foreach (var filePath in filePaths) 
     { 
      // hash path 
      byte[] pathBytes = Encoding.UTF8.GetBytes(filePath); 
      md5.TransformBlock(pathBytes, 0, pathBytes.Length, pathBytes, 0); 

      // hash contents 
      byte[] contentBytes = File.ReadAllBytes(filePath); 

      md5.TransformBlock(contentBytes, 0, contentBytes.Length, contentBytes, 0); 
     } 

     //Handles empty filePaths case 
     md5.TransformFinalBlock(new byte[0], 0, 0); 

     return BitConverter.ToString(md5.Hash).Replace("-", "").ToLower(); 
    } 
} 
+0

के बजाय "\ *" होना चाहिए यदि आप इस संस्करण का उपयोग करते हैं, तो आप 'pathPytes' को बनाने के लिए 'filePath' को रिश्तेदार पथ पर छोटा करना चाहते हैं। –