হ্যাশ দ্বারা ফাইলের অংশগুলি কীভাবে তুলনা করবেন?


19

আমার একটি সফলভাবে ডাউনলোড করা ফাইল এবং অন্য একটি ব্যর্থ ডাউনলোড (বড় ফাইলের প্রথম প্রথম 100 এমবি) যা আমার সন্দেহ হয় একই ফাইল।

এটি যাচাই করার জন্য, আমি তাদের হ্যাশগুলি পরীক্ষা করতে চাই, তবে যেহেতু আমার কাছে কেবলমাত্র ব্যর্থ ডাউনলোড করা ফাইলের একটি অংশ আছে, আমি কেবল প্রথম কয়েক মেগাবাইট বা আরও কিছু হ্যাশ করতে চাই।

আমি এটা কিভাবে করবো?

ওএস উইন্ডোজ হতে পারে তবে আমি সাইগউইন এবং মিনজিডাব্লু ইনস্টল করেছি।


1
স্থানীয় কম্পিউটারে একটি ফাইলকে দক্ষ কম্পিউটারের সাথে অন্য কম্পিউটারের সাথে অন্য একটি ফাইলের সাথে তুলনা করা আরএসসিঙ্কের একটি মূল অংশ , যা একটি বিশেষ হ্যাশ ফাংশনের সাথে ফাইলগুলির অংশগুলির সাথে তুলনা করে।
ডেভিড ক্যারি

@DavidCary আমার ক্ষেত্রে, আমি দূরবর্তী কম্পিউটারের শেল অ্যাক্সেস না থাকে, কিন্তু ধন্যবাদ ইঙ্গিতটি জন্য, আমি র manpage পড়তে হবে
পাপ

উত্তর:


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
@ কামিলম্যাসিওরোস্কি হ্যাঁ, সত্য। তবে এই পদ্ধতিটি এখনও জুটিওয়ালা ক্ষেত্রে হ্যাশগুলির তুলনা করার চেয়ে দ্রুততর হয়।
কনরাড রুডল্ফ

8
এটি টু-গো সমাধান। cmpআপনার bashচলমান থাকলে ইতিমধ্যে ইনস্টল হওয়া 99.99% নিশ্চিত , এবং এটি কাজ করে। প্রকৃতপক্ষে, cmp -n 131072 one.zip two.zip খুব কাজ করবে। টাইপ করার জন্য খুব কম অক্ষর এবং দ্রুত সম্পাদন। একটি হ্যাশ গণনা অযৌক্তিক। এটি সম্পূর্ণ 100MB ফাইলটি পড়ার প্রয়োজন, এবং সম্পূর্ণ ফাইলের একটি 100MB অংশ, যা অর্থহীন। যদি তারা জিপ ফাইল হয় এবং সেগুলি পৃথক হয় তবে প্রথম কয়েকশ বাইটের মধ্যে পার্থক্য থাকবে। রেডহেড যদিও 128 কে ডিফল্টরূপে বিতরণ করে, তাই আপনি 128 কে পাশাপাশি (1 বাইটের সাথে তুলনা করার মতো দাম) তুলনা করতে পারেন।
দামন

19
--bytesবিকল্পটি কেবল কার্যকে জটিল করে তুলছে। কেবল cmpএই বিকল্পটি ছাড়াই চালান এবং এটি আপনাকে প্রথম বাইট দেখায় যা ফাইলগুলির মধ্যে পৃথক। যদি সমস্ত বাইট একই হয় তবে এটি EOFসংক্ষিপ্ত ফাইলটিতে প্রদর্শিত হবে। এটি আপনাকে আপনার উদাহরণের চেয়ে আরও বেশি তথ্য দেবে - কত বাইট সঠিক।
পাবউক

2
আপনার যদি জিএনইউ থাকে cmp(এবং, আমি মনে করি প্রত্যেকেরই বেশ কিছু হয়), আপনি অনুরোধের সাথে জিনিসগুলিকে জটিল করার পরিবর্তে ব্যবহার করতে পারেন --ignore-initialএবং --bytesতর্ক করতে পারেন dd
ক্রিস্টোফার শুল্টজ 14

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 এ পাইপ করার কোনও উপায় আছে?
পাপ করেছে

1
আপনার অনুরোধ অনুসারে আমি আরও একটি উপায় যুক্ত করেছি
ডেভিডবাউমান

8
কেন হ্যাশ তৈরি? কেবলমাত্র ফাইলের টুকরোগুলি সরাসরি (তুলনায় cmp) তুলনা করার চেয়ে এটি অনেক কম দক্ষ ।
কনরাড রুডল্ফ

আপনার মাঝারি কোডের নমুনায় আপনি দুটিবার 100100mb1.dat বলছেন। আপনি কি প্রথম 100 মিম্ব 2। দ্বিতীয়টির জন্য ডেড বোঝাতে চেয়েছিলেন ?
doppelgreener

@ কনরাড রুডল্ফ, "কেন হ্যাশগুলি তৈরি করবেন?" আপনার সমাধান (ব্যবহার করা cmp) কোনও সন্দেহ ছাড়াই বিজয়ী। তবে সমস্যাটি সমাধানের এই পদ্ধতিতে (হ্যাশগুলি ব্যবহার করে) যতক্ষণ না এটি আসলে সমস্যাটি সমাধান করে ততক্ষণ বিদ্যমান থাকার অধিকার রয়েছে (:
ভিএল-80

7

প্রত্যেকে এটির সাথে ইউনিক্স / লিনাক্সের পথে যেতে বলে মনে হচ্ছে তবে উইন্ডোজ স্ট্যান্ডার্ড কমান্ডের সাথে কেবল 2 টি ফাইলের তুলনা করা যায়:
FC /B file file2

এফসি উপস্থিত প্রতিটি উইন্ডোজ এনটি সংস্করণে উপস্থিত রয়েছে। এবং (যদি আমি সঠিকভাবে স্মরণ করি) ডস-এ উপস্থিত ছিল।
এটি কিছুটা ধীর গতির, তবে এটি এককালীন ব্যবহারের জন্য গুরুত্বপূর্ণ নয়।


6

আপনি কেবল ফাইলগুলি সরাসরি বাইনারি / হেক্স ডিফ প্রোগ্রামের সাথে তুলনা করতে পারেন vbindiff। এটি দ্রুত লিনাক্স এবং উইন্ডোজে 4 গিগাবাইট পর্যন্ত ফাইলগুলির তুলনা করে।

এই জাতীয় কিছু দেখায় কেবলমাত্র লাল (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

আমি জানি এটি বাশের পক্ষে বলে, কিন্তু ওপিতে আরও জানায় যে তাদের উইন্ডোজ রয়েছে। যে কেউ উইন্ডোজ সমাধান চান / চান তার জন্য এইচএক্সডি নামে একটি প্রোগ্রাম রয়েছে যা একটি হেক্স সম্পাদক যা দুটি ফাইলের তুলনা করতে পারে। ফাইলগুলি যদি বিভিন্ন আকারের হয় তবে এটি উপলব্ধ অংশগুলি একই কিনা তা জানাবে। এবং যদি প্রয়োজন হয় তবে এটি বর্তমানে নির্বাচিত যা কিছু জন্য চেকসাম চালাতে সক্ষম। এটি নিখরচায় এবং ডাউনলোড করা যেতে পারে: এইচএক্সডি ওয়েবসাইট । লেখক (গুলি) এর সাথে আমার কোনও সংযোগ নেই, আমি কয়েক বছর ধরে এটি ব্যবহার করে চলেছি।


0

ছোট ফাইলের দৈর্ঘ্য পর্যন্ত দুটি ফাইল অভিন্ন হলে সিএমপি আপনাকে জানায়:

$ 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

সিএমপি আপনাকে বলছে যে তুলনা দুটি ফাইলের মধ্যে কোনও পার্থক্য সনাক্ত করার আগে একটি ফাইলের একটি ইওএফ-এর মুখোমুখি হয়েছিল।


ভাল যুক্তি. যদি আপনি এটি না দেখে থাকেন তবে পবউক ইতিমধ্যে গৃহীত উত্তরের বিষয়ে মন্তব্য করেছেন।
পাপ করেছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.