हैश द्वारा फाइलों के हिस्सों की तुलना कैसे करें?


19

मेरे पास एक सफलतापूर्वक डाउनलोड की गई फ़ाइल है और दूसरा विफल डाउनलोड (केवल एक बड़ी फ़ाइल का पहला 100 एमबी) जो मुझे संदेह है कि वही फ़ाइल है।

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

मैं यह कैसे करु?

ओएस विंडोज़ होगा, लेकिन मेरे पास साइबरविन और मिनगॉव स्थापित हैं।


1
दूर के कंप्यूटर पर किसी अन्य फ़ाइल के साथ स्थानीय कंप्यूटर पर एक फ़ाइल की तुलना करना rsync का एक महत्वपूर्ण हिस्सा है , जो एक विशेष हैश फ़ंक्शन के साथ फ़ाइलों के कुछ हिस्सों की तुलना करता है।
डेविड कैरी

@DavidCary मेरे मामले में, मैं दूरस्थ कंप्यूटर से खोल पहुँच नहीं है, लेकिन धन्यवाद संकेत के लिए, मैं मैनपेज पढ़ा जाएगा
पाप

जवाबों:


56

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

केवल एक बार दो फ़ाइलों की तुलना करने पर इसका कोई मतलब नहीं है: हैश की गणना करने का प्रयास कम से कम फाइलों पर चलने और सीधे उनकी तुलना करने में अधिक है।

एक कुशल फ़ाइल तुलना उपकरण है cmp:

cmp --bytes $((100 * 1024 * 1024)) file1 file2 && echo "File fragments are identical"

आप इसे ddदो फाइलों की तुलना में मनमाने भागों (शुरुआत से जरूरी नहीं) की तुलना के साथ जोड़ सकते हैं , जैसे:

cmp \
    <(dd if=file1 bs=100M count=1 skip=1 2>/dev/null) \
    <(dd if=file2 bs=100M count=1 skip=1 2>/dev/null) \
&& echo "File fragments are identical"

6
नोट: फ़ाइलों की तुलना करने के लिए हैश बनाना भी समझ में आता है अगर आप एक ही समय में दो फ़ाइलों को पढ़ने से बचना चाहते हैं।
कामिल मैकियोरोस्की

1
@KamilMaciorowski हाँ, सच है। लेकिन यह विधि अभी भी आमतौर पर जोड़ीदार मामले में हैश की तुलना करने से तेज होगी।
कोनराड रुडोल्फ

8
यह टू-गो सॉल्यूशन है। cmpयदि आपके पास bashचल रहा है, तो 99.99% पहले से स्थापित होना निश्चित है और यह काम करता है। वास्तव में, cmp -n 131072 one.zip two.zip काम भी करेगा। टाइप करने के लिए सबसे कम अक्षर, और सबसे तेज़ निष्पादन। हैश की गणना करना निरर्थक है। इसे पढ़ने के लिए पूरी 100MB फ़ाइल की आवश्यकता होती है, साथ ही पूरी फ़ाइल का 100MB हिस्सा, जो व्यर्थ है। यदि वे ज़िप फ़ाइलें हैं और वे अलग-अलग हैं, तो पहले कुछ सौ बाइट्स में अंतर होगा। Readahead डिफ़ॉल्ट रूप से 128k बचाता है, इसलिए आप 128k (1 बाइट की तुलना में समान लागत) की तुलना कर सकते हैं।
डेमोन

19
--bytesविकल्प केवल कार्य उलझी है। बस cmpइस विकल्प के बिना चलाएं और यह आपको पहली बाइट दिखाएगा जो फाइलों के बीच भिन्न होती है। यदि सभी बाइट्स समान हैं तो यह EOFछोटी फ़ाइल पर दिखाई देगा । यह आपको आपके उदाहरण से अधिक जानकारी देगा - कितने बाइट्स सही हैं।
पाबूक

2
यदि आपके पास GNU है cmp(और, मुझे लगता है कि हर कोई बहुत कुछ करता है), तो आप इनवॉइस के साथ चीजों को जटिल करने के बजाय तर्क --ignore-initialऔर उपयोग कर सकते हैं । --bytesdd
क्रिस्टोफर

12

मुझे खेद है कि मैं ठीक से कोशिश नहीं कर सकता, लेकिन यह काम करेगा

dd if=yourfile.zip of=first100mb1.dat bs=100M count=1
dd if=yourotherfile.zip of=first100mb2.dat bs=100M count=1

यह आपको दोनों फाइलों का पहला 100 मेगाबाइट मिलेगा।

अब हैश प्राप्त करें:

sha256sum first100mb1.dat && sha256sum first100mb2.dat 

आप इसे सीधे भी चला सकते हैं:

dd if=yourfile.zip bs=100M count=1 | sha256sum 
dd if=yourotherfile.zip bs=100M count=1 | sha256sum 

1
वहाँ मध्यवर्ती फ़ाइल के बिना sha256sum में किसी तरह dd पाइप करने के लिए एक रास्ता है?
पाप किया

1
मैंने आपके अनुरोध के अनुसार एक और तरीका जोड़ा
davidbaumann

8
हैश क्यों बनाएं? यह फ़ाइल अंशों की सीधे तुलना करने (उपयोग करने cmp) की तुलना में बहुत कम कुशल है ।
कोनराड रुडोल्फ

आपके मध्य कोड के नमूने में आप कहते हैं कि पहले 100mb1.dat दो बार। क्या आपका मतलब पहले 100mb 2 से था। दूसरे के लिए।
डोपेलग्रेनर

@KonradRudolph, "हैश क्यों बनाएं?" आपका समाधान (उपयोग करना cmp) संदेह के बिना एक विजेता है। लेकिन समस्या को हल करने का यह तरीका (हैश का उपयोग करना) भी तब तक सही है जब तक यह वास्तव में समस्या को हल करता है (:
VL-80

7

हर कोई इसके साथ यूनिक्स / लिनक्स मार्ग पर जाता है, लेकिन बस 2 फाइलों की तुलना आसानी से विंडोज मानक कमांड के साथ की जा सकती है:
FC /B file file2

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


6

आप बस सीधे फाइलों की तुलना कर सकते हैं, जैसे कि एक द्विआधारी / हेक्स अंतर कार्यक्रम vbindiff । यह जल्दी से लिनक्स और विंडोज पर 4GB तक की फाइलों की तुलना करता है।

कुछ इस तरह दिखता है, केवल लाल रंग में हाइलाइट किया गया अंतर (1 बी बनाम 1 सी):

one                                       
0000 0000: 30 5C 72 A7 1B 6D FB FC  08 00 00 00 00 00 00 00  0\r..m.. ........  
0000 0010: 00 00 00 00                                       ....
0000 0020:
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080: 
0000 0090: 
0000 00A0: 

two        
0000 0000: 30 5C 72 A7 1C 6D FB FC  08 00 00 00 00 00 00 00  0\r..m.. ........  
0000 0010: 00 00 00 00                                       ....               
0000 0020: 
0000 0030:
0000 0040:
0000 0050:
0000 0060:
0000 0070:
0000 0080:
0000 0090:                                
0000 00A0:             
┌──────────────────────────────────────────────────────────────────────────────┐
Arrow keys move  F find      RET next difference  ESC quit  T move top        
C ASCII/EBCDIC   E edit file   G goto position      Q quit  B move bottom     
└──────────────────────────────────────────────────────────────────────────────┘ 

मेरे मामले में, फाइलें ज़िप अभिलेखागार हैं, इसलिए इसमें कोई सार्थक पाठ नहीं है। हैश मान की तुलना में तेज और कम त्रुटि वाला होना चाहिए।
पाप किया

2
यदि आपका मतलब ASCII टेक्स्ट है, तो यह अप्रासंगिक है। vbindiff(और कोनराड के cmp) बाइनरी डेटा की तुलना करते हैं, बाइट के लिए बाइट। वास्तव में मूल्यों में टक्करों का अनुभव करने की अधिक संभावना है
Xen2050

* माध्य " उपरोक्त टिप्पणियों में वास्तव में एचएएसएच मूल्यों को टकराव का अनुभव होने की अधिक संभावना है", एच याद किया!
Xen2050

0

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


0

जब दो फाइलें छोटी फाइल की लंबाई के बराबर होती हैं, तो cmp आपको बताएगा:

$ dd if=/dev/random bs=8192 count=8192 > a
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.514571 secs (130417197 bytes/sec)
$ cp a b
$ dd if=/dev/random bs=8192 count=8192 >> b 
8192+0 records in
8192+0 records out
67108864 bytes transferred in 0.512228 secs (131013601 bytes/sec)
$ cmp a b
cmp: EOF on a

cmp आपको बता रहा है कि तुलना करने से पहले फाइल पर EOF का सामना करना पड़ा, इससे दो फाइलों के बीच कोई अंतर पाया गया।


अच्छी बात। यदि आपने इसे नहीं देखा है, तो यह वही है जो पहले से ही स्वीकृत उत्तर पर टिप्पणी करता है।
पाप किया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.