2009-04-25 7 views
6

निर्धारण करने के लिए एल्गोरिथ्म: Algorithm for determining a file’s identityएक फ़ाइल की पहचान (अनुकूलन) इस सवाल का आगे

संक्षिप्त: मैं जो समय के विशाल बहुमत से काम करता है एक फाइल को पहचान निर्धारित करने के लिए एक सस्ते एल्गोरिथ्म के लिए देख रहा हूँ।

मैं आगे बढ़ गया और एक एल्गोरिदम लागू किया जो मुझे "सुंदर अद्वितीय" हैश प्रति फ़ाइल देता है।

तरह से मेरी एल्गोरिथ्म काम करता है:

  • एक निश्चित सीमा से की तुलना में छोटे फ़ाइलों के लिए मैं पहचान हैश के लिए पूरा फ़ाइलें सामग्री का उपयोग करें।

  • थ्रेसहोल्ड से बड़ी फ़ाइलों के लिए मैं एक्स आकार के यादृच्छिक एन नमूने लेता हूं।

  • मैं हैश किए गए डेटा में फाइलसाइज शामिल करता हूं। (जिसका अर्थ है विभिन्न आकारों के साथ सभी फाइलों को एक अलग हैश में परिणाम)

सवाल:

  • क्या मान मैं एन और एक्स के लिए चुनना चाहिए (कितने यादृच्छिक नमूने मैं जो आकार का लेना चाहिए?) मैं 8 के प्रत्येक के 4 नमूने के साथ गया और एल्गोरिदम को स्टंप करने में सक्षम नहीं हूं। मैंने पाया कि नमूने की मात्रा में तेजी से बढ़ने से एल्गोरिदम की गति कम हो जाती है (कारण खोज बहुत महंगी होती है)

  • गणित एक: इस एल्गोरिदम को उड़ाने के लिए मेरी फ़ाइलों को कितनी अलग-अलग करने की आवश्यकता है। (एक ही लंबाई वाले 2 अलग-अलग फाइलें एक ही हैश होने के बाद समाप्त होती हैं)

  • ऑप्टिमाइज़ेशन एक: क्या कोई तरीका है कि मैं थ्रूपुट को बेहतर बनाने के लिए अपने ठोस कार्यान्वयन को अनुकूलित कर सकता हूं (मुझे लगता है कि मैं लगभग 100 फाइलें एक सेकंड पर कर सकता हूं मेरी प्रणाली)।

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

प्रासंगिक जानकारी:

The algorithm I implemented

आपकी मदद के लिए धन्यवाद!

+0

नाइटपिकिंग: हस्ताक्षर !? आपका मतलब हस्ताक्षर है? –

उत्तर

1
  • हमेशा हैश में फ़ाइल का पहला और अंतिम ब्लॉक शामिल करें।

ऐसा इसलिए है क्योंकि वे फ़ाइल से फ़ाइल में अलग होने की संभावना रखते हैं। यदि आप बीएमपी पर विचार करते हैं, तो इसमें काफी मानक शीर्षलेख हो सकता है (जैसे 800x600 छवि, 24 बिट, शून्य आराम), ताकि आप अलग-अलग डेटा प्राप्त करने के लिए हेडर को थोड़ा सा ओवरशूट करना चाहें। समस्या यह है कि हेडर आकार में जंगली रूप से भिन्न होते हैं।

अंतिम ब्लॉक फ़ाइल प्रारूपों के लिए है जो डेटा को मूल में जोड़ते हैं।

    आकार के ब्लॉक में
  • पढ़ें कि फाइल सिस्टम आप उपयोग करना निवासी है, या कम से कम 512
  • से विभाज्य हमेशा ऑफसेट कि ब्लॉकसाइज से विभाज्य है पर ब्लॉक पढ़ें।
  • यदि आपको समान आकार की फ़ाइल के लिए समान मिलता है, तो इसका गहरा स्कैन करें (हैश सभी डेटा) और इसे फिर से स्कैन करने के लिए फ़ाइलपैथ को याद रखें।

फिर भी जब तक आप भाग्यशाली आप कुछ फ़ाइलें misidentify जाएगा रहे हैं के रूप में ही है (उदाहरण के SQL सर्वर डेटाबेस फ़ाइल के लिए है और यह 1 है: 1 बैकअप प्रतिलिपि के बाद केवल कुछ सम्मिलन; सिवाय इसके कि एसएस एक टाइमस्टैम्प लिखने करता है ..)

+0

पहला और अंतिम ब्लॉक एक दिलचस्प अनुकूलन है (विचार किसी विशेष प्रारूप के लिए अनुकूलन वास्तव में आकर्षक है उदाहरण के लिए वीओबी इस तरह से समस्याग्रस्त हैं)। विभाजित ब्लॉक पढ़ने के संबंध में, मुझे लगता है कि यह मदद करता है कि एफएस खंडित नहीं है। हाँ यह सुनिश्चित करने के लिए गहरा स्कैन विचार एक अच्छी चाल हो सकता है कि यह वास्तव में कभी विफल नहीं होता है। –

1

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

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

यदि आप एक अद्वितीय फ़ाइल लंबाई के साथ एक नई फ़ाइल देखते हैं, तो बस फ़ाइल की लंबाई संग्रहित करें। यदि एक ही लंबाई वाली एक और फ़ाइल जोड़ दी जाती है, तो दोनों फाइलों के हैंश की गणना तब तक करें जब तक कि वे भिन्न न हों।फ़ाइल की लंबाई, हैश और हैश में फ़ाइल के कितने ब्लॉक शामिल हैं। जब भी आप मिलान फ़ाइल की लंबाई और हैंश का पता लगाते हैं और आपने अभी तक पूरी फ़ाइल नहीं छोड़ी है, तो आप अधिक ब्लॉक जोड़कर हैश बढ़ाते हैं।

प्रदर्शन के बारे में कुछ विचार। छोटी फाइलों के लिए, बराबर फ़ाइल लंबाई की संभावना काफी अधिक है - इतनी अलग-अलग छोटी फ़ाइल लंबाई नहीं हैं। लेकिन हैश छोटी फाइलों के लिए महंगा नहीं है।

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

अंत में आप अलग-अलग फ़ाइलों का पता लगाना सुनिश्चित करेंगे (हैश टकराव को छोड़कर) क्योंकि यदि आवश्यक हो तो आप पूरी फ़ाइल को हश करेंगे।

अद्यतन

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

लेकिन सामान्य रूप से फिल्म फ़ाइलों के लिए, मैं फ़ाइल के बीच से केवल एक ब्लॉक (शायद 512 बाइट) होगा। एक ही स्थिति में एक ही छवि और ध्वनि के साथ दो अलग-अलग फिल्में? इस परीक्षण को विफल करने के लिए फ़ाइलों में हेरफेर करने के अलावा व्यावहारिक रूप से अपरिवर्तनीय। लेकिन आप सभी निर्धारक नमूना रणनीतियों को विफल करने के लिए फ़ाइलों को आसानी से उत्पन्न कर सकते हैं - इसलिए यह वास्तव में कोई फर्क नहीं पड़ता।

+1

आरई: "यदि आप एक अद्वितीय फ़ाइल लंबाई के साथ एक नई फ़ाइल देखते हैं" यह वास्तव में एक मुश्किल समस्या है, क्योंकि यह मूल फ़ाइल हो सकती है और यह कहीं और स्थानांतरित हो जाती है। मैं मानता हूं कि एल्गोरिदम 100% सुरक्षित नहीं है, लेकिन मुझे वास्तविक वीडियो (डीवीडी/एवीआई इत्यादि ...) के साथ असफल होने में सचमुच असंभव लगता है। मुझे लगता है कि यह हैशिंग का एक अच्छा पहला स्तर है और लंबाई से कहीं अधिक मजबूत है अकेला। –

+0

फिल्मों के लिए मैं फ़ाइल की लंबाई व्यावहारिक अद्वितीय मानता हूं। क्या आपके पास एक ही आकार के साथ दो अलग-अलग फाइलें हैं? ठीक है, अगर किसी दिए गए माध्यम पर फिट होने के लिए रिकोड किया जा सकता है - (एस) वीसीडी फिल्में सभी फाइल लेंस की एक छोटी सी श्रृंखला में होंगी। लेकिन मीडिया फ़ाइलों के लिए मैं फ़ाइल के बीच से केवल एक ब्लॉक (शायद 512 बाइट) हैश। एक ही स्थिति में एक ही छवि और ध्वनि के साथ दो अलग-अलग फिल्में? इस परीक्षण को विफल करने के लिए फ़ाइलों में हेरफेर करने के अलावा व्यावहारिक रूप से अपरिवर्तनीय। –

0
  1. पीछे की तलाश न करें और फ़ाइल को FILE_FLAG_SEQUENTIAL_SCAN (विंडोज़ पर) खोलें।
    (एक्स यादृच्छिक संख्या का चयन करें, फिर उन्हें क्रमबद्ध करें)।
  2. दूर जाने के लिए, आगे के कैश पढ़ने में कुछ डेटा है।
  3. यदि आपके पास बड़ी विभाजन है तो आपके विभाजन को बड़े क्षेत्र के आकार के लिए प्रारूपित करें।
  4. आप आईडी के लिए एक ग्रिड वापस करते हैं, हैश एल्गोरिदम को 128 बिट की आवश्यकता होती है।
+0

टाइपो को ठीक किया गया :) समाधान स्थिति को व्यवस्थित करता है इसलिए मैं पीछे की ओर नहीं खोज रहा हूं ... मैं .NET में FILE_FLAG_SEQUENTIAL_SCAN को सेट करने के बारे में कैसे जा सकता हूं? मुझे वास्तव में सी # से कम स्तर की जानकारी तक पहुंच नहीं है ... –

+0

लोलेवल (AFAIK), CreateFile का उपयोग करें (pinvoke.net आपका मित्र है) और intPtr को छोड़कर ctor का उपयोग करें। –

+0

दर्द का दर्द :) मुझे किस प्रकार का प्रदर्शन लाभ मिलेगा, क्या यह 2 एक्स तेज है? –

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