অনুলিপি করা ফাইলটি কি কোনও অনুলিপিযুক্ত ফাইলটি মূলের মতো কিনা তা পরীক্ষা করার জন্য কি প্রতিটি একক বাইট পড়তে হবে?


16

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

আমার প্রশ্ন: এটি কি প্রয়োজনীয়? সিআরসি বা এই জাতীয় কোনও কৌশল কী ভুল হতে পারে? আপনি কি একজন প্রোগ্রামার হিসাবে এই নিখুঁত তবে ধীর সিস্টেমটি ব্যবহার করে প্রয়োগ এবং প্রয়োগ করা উচিত নাকি এটি অত্যন্ত চরম?


3
"আরএসসিএনসি" কীভাবে এটি পরিচালনা করে তা একবার দেখুন।

21
উভয় ফাইলে সিআরসি (বা, আরও ভাল, sha1sums) গণনা করার জন্য যাইহোক, প্রতি বাইট পড়ার প্রয়োজন। আপনি যদি বাই-বাই-বাইট তুলনা করেন, তবে কোনও অমিল দেখা মাত্রই আপনি প্রস্থান করতে পারেন - এবং একই চেকসামটি ঘটতে দেখা যায় এমন দুটি পৃথক ফাইল সম্পর্কে আপনাকে চিন্তিত হওয়ার দরকার নেই (যদিও এটি sha1sum এর সম্ভাব্য সম্ভাবনা নয়) । অন্যদিকে, আপনি যখন একই মেশিনে নেই এমন ফাইলগুলির সাথে তুলনা করছেন তখন চেকসাম তুলনা কার্যকর হয়; চেকসামগুলি স্থানীয়ভাবে গণনা করা যেতে পারে এবং আপনাকে নেটওয়ার্কের মাধ্যমে সম্পূর্ণ সামগ্রী স্থানান্তর করতে হবে না।
কিথ থম্পসন

3
সংঘর্ষের সম্ভাবনা হিসাবে, যদি আপনি নিজের মতো একটি শালীন হ্যাশ ব্যবহার করেন sha1sumতবে এটি সম্পর্কে খুব বেশি চিন্তা করার দরকার নেই, যদি না কেউ ইচ্ছাকৃতভাবে এবং ব্যয়বহুলভাবে ফাইলগুলি তৈরি করেন যাঁর sha1sums সংঘর্ষ হয়। এর জন্য আমার কাছে কোনও উত্স নেই, তবে আমি শুনেছি (গিটের প্রসঙ্গে) আপনার ডেভেলপমেন্ট দলের প্রত্যেক সদস্যের খাওয়ার সম্ভাবনা প্রায় একই শ 1 সাম রয়েছে এমন দুটি পৃথক ফাইলের সম্ভাবনা প্রায় নেকড়ে। একই দিনে. সম্পূর্ণ সম্পর্কহীন ঘটনাগুলিতে।
কিথ থম্পসন

5
@ কিথথম্পসন: আমি মনে করি আপনার প্রথম মন্তব্যটির উত্তর হওয়া উচিত :-)
ডিন হার্ডিং

6
সংক্ষিপ্ত উত্তর - না, আপনার কম্পিউটারটি এটি আপনার জন্য করা ভাল।
PSr

উত্তর:


40

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

অন্যদিকে, আপনি যখন একই মেশিনে নেই এমন ফাইলগুলির সাথে তুলনা করছেন তখন চেকসাম তুলনা কার্যকর হয়; চেকসামগুলি স্থানীয়ভাবে গণনা করা যেতে পারে এবং আপনাকে নেটওয়ার্কের মাধ্যমে সম্পূর্ণ সামগ্রী স্থানান্তর করতে হবে না।

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

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

সংঘর্ষের সম্ভাবনা হিসাবে, যদি আপনি sha1sum এর মতো একটি শালীন হ্যাশ ব্যবহার করেন তবে আপনাকে এটি সম্পর্কে খুব বেশি চিন্তা করতে হবে না, যদি না কেউ ইচ্ছাকৃতভাবে এবং ব্যয়বহুলভাবে ফাইল তৈরি করে যাঁর sha1sums সংঘর্ষে লিপ্ত হয় ( যখন আমি প্রথম এটি লিখেছিলাম তখন এ জাতীয় সংঘর্ষ উত্পন্ন করা সম্ভব ছিল না) , তবে অগ্রগতি হচ্ছে )। স্কট চকনের "প্রো গিট" , বিভাগ 6.1 এর উদ্ধৃতি :

SHA-1 সংঘর্ষ পেতে এটি কী গ্রহণ করবে তা সম্পর্কে আপনাকে ধারণা দেওয়ার জন্য এখানে একটি উদাহরণ রয়েছে। পৃথিবীর সমস্ত .5.৫ বিলিয়ন মানুষ যদি প্রোগ্রামিং করে থাকেন এবং প্রতি সেকেন্ডে, প্রত্যেকে এমন একটি কোড তৈরি করে যা পুরো লিনাক্স কার্নেল ইতিহাসের (1 মিলিয়ন গিট অবজেক্ট) সমতুল্য ছিল এবং এটিকে একটি বিশাল গিট রিপোজিটরিতে ঠেলেছিল, তবে এটির জন্য 5 বছর সময় লাগবে সেই সংগ্রহস্থলে একক SHA-1 অবজেক্টের সংঘর্ষের 50% সম্ভাবনা থাকার জন্য পর্যাপ্ত অবজেক্ট রয়েছে। একটি উচ্চ সম্ভাবনা বিদ্যমান যে আপনার প্রোগ্রামিং টিমের প্রতিটি সদস্য একই রাতে সম্পর্কযুক্ত ঘটনায় নেকড়েদের দ্বারা আক্রমণ ও হত্যা করা হবে।

সারসংক্ষেপ :

স্থানীয় বাইরের তুলনা বাই বাই বাই তুলনা ভাল। sha1sum দূরবর্তী তুলনায় ভাল, এবং মিথ্যা ধনাত্মক কোন উল্লেখযোগ্য সুযোগ উপস্থাপন করে।


এটি লক্ষ করা উচিত যে "ভাল" হ্যাশ ফাংশনটির সাধারণ সংজ্ঞাটিতে সেই সম্পত্তি অন্তর্ভুক্ত থাকে যা একই হ্যাশ ("সংঘর্ষ-প্রতিরোধ") দিয়ে বিভিন্ন ইনপুট তৈরি করা খুব শক্ত। SHA-1 এর ক্ষেত্রে কিছু (এখনও পর্যন্ত তাত্ত্বিক) দুর্বলতা রয়েছে, তবে আপনি যথেষ্ট চেষ্টা করেও আপনি "দুটি সংঘর্ষের সাথে দুটি ফাইল তৈরি করতে পারবেন না", এমনকি যদি আপনি যথেষ্ট চেষ্টা করেন।

@ সালস্ক: আপডেট
কেইথ থম্পসন

1
@ কিথথম্পসন আমি উত্তরটি উত্সাহিত করছি, তবে আমার মনে হয় এসএএএএ 1
কে.স্টেফ

আমি সন্দেহ করি যদি আপনি গিটহাবের এই তাত্ত্বিক রেপো হোস্ট করার চেষ্টা করেন তবে তারা ক্র্যাঙ্ক হয়ে যাবে।
hBy2Py

1
আমি আরও বোঝাতে চাইছি যে তারা প্রতি সেকেন্ডে ডাটা থ্রাস্ট করে প্রচুর এক্সাবাইট থাকার কারণে তারা অসন্তুষ্ট হবে। :-)
hBy2Py

10

এটি সম্পর্কে চিন্তা করার আরও একটি উপায় এখানে।

যদি দুটি পৃথক ফাইলের একই সিআরসি হওয়ার কোনও সম্ভাবনা না থাকে তবে এক্সটেনশনের মাধ্যমে এর অর্থ হ'ল প্রতিটি ফাইল একটি অনন্য সিআরসি দ্বারা উপস্থাপন করা যায় f যদি সিআরসি মূল ফাইলের চেয়ে ছোট ছিল তবে এটি লসলেস সংকোচনের একটি রূপকে উপস্থাপন করবে। যদি তা না হয় তবে আপনি মূল ফাইলগুলির সাথে তুলনা করতে কেবল একই কাজ করবেন যেহেতু আপনি একই সংখ্যক বাইটের সাথে তুলনা করছেন।

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

এখানে একটি সাদৃশ্য রয়েছে:
আপনি যদি চিঠি দ্বারা চিঠির সাথে তুলনা না করে দুটি মুদ্রিত দলিল অভিন্ন কিনা তা দ্রুত নির্ধারণ করার কোনও উপায় চান, তবে আপনি নথির প্রতিটি লাইনের বর্ণগুলির গণনা তুলনা করতে পারবেন। যদি সমস্ত বিষয়গুলি মিলে যায়, তবে প্রতিক্রিয়াগুলি উল্লেখযোগ্যভাবে উন্নত করে যে নথিগুলি অভিন্ন, তবে কেউ এই যুক্তিটি ব্যবহার করবে না যে আপনি নিশ্চিত হতে পারেন যে এই অক্ষরটি ব্যবহার করে প্রতিটি চিঠি একই ছিল।


3

অভিন্ন ফাইলগুলি পরীক্ষা করার একমাত্র সঠিক উপায় বাইট তুলনা করার জন্য বাইট। ন্যায্য আনুমানিক হওয়ার আরেকটি উপায় হ'ল এমডি 5 এর মতো একটি হ্যাশ ফাইলের জন্য গণনা করা এবং সেগুলি তুলনা করা। এটি হ্যাশের সংঘর্ষ হতে পারে তবে খুব সম্ভবত এটি সম্ভব নয়।

আমি কল্পনা করব যে বাইট তুলনা করার সময় আপনি যখন তুলনা করছেন তখন উভয় ফাইলের মধ্যে হ্যাশ গণনা করার চেয়ে দ্রুত হবে। তবে, যদি আপনার অ্যাপ্লিকেশনটি হ্যাশটির প্রাক-গণনা করে এবং আপনার ফাইলগুলি সম্পর্কে মেটা-ডেটা সঞ্চয় করে, হ্যাশের তুলনা করা তাত্পর্যপূর্ণভাবে দ্রুত হবে।

সিআরসি সম্ভবত যাওয়ার উপায় নয় কারণ এটি কেবল একটি ত্রুটি সনাক্তকরণ ব্যবস্থা, হ্যাশ নয়। (বা প্রচুর সংঘর্ষের সাথে একটি দরিদ্র হ্যাশ)


+1 সম্মত হন। আপনার হার্ড ড্রাইভটি হ্যাশিং ফাংশনের যথাযথ সংঘর্ষের তুলনায় ভেঙে যাওয়ার সম্ভাবনা অনেক বেশি (সিআরসি 32 দুর্বল - এটিও সম্মত)।
মিচা Šরাজের

2

১০০% নির্দিষ্ট দুটি ফাইল অভিন্ন হওয়ার জন্য আপনাকে সত্যই বাইটগুলি পরীক্ষা করতে হবে check

কেন? হ্যাশের সংঘর্ষ, ঠাট কেন! হ্যাশিংয়ের জন্য ব্যবহৃত অ্যালগরিদমের উপর নির্ভর করে সংঘর্ষ কমবেশি সম্ভাব্য হতে পারে তবে এটি আর কম নয়। এই পদক্ষেপগুলি অনুসরণ করে:

  1. ফাইলের আকার পরীক্ষা করুন
  2. মাইম প্রকারগুলি পরীক্ষা করুন
  3. হ্যাশ চেক করুন
  4. কয়েকটি এলোমেলো অফসেট পরীক্ষা করে বিটের তুলনা করুন

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


আমি মনে করি আপনি যদি একটি ভাল হ্যাশিং অ্যালগরিদম চয়ন করেন, তবে ২ এবং ৪ আপনাকে কোনও বাস্তব বৃদ্ধি "সমান" মানের দেয় না। সম্ভবত 1. কেবল দুর্বল হ্যাশের জন্য প্রয়োজন।
মিশা łরাজের

1
-1 এটি বোঝা যায় না। যদি আপনি একটি ভাল হ্যাশিং অ্যালগরিদম চয়ন করেন তবে অন্য সমস্ত পদক্ষেপগুলি অতিরিক্ত প্রয়োজন are 1. এবং 4. আসলে হ্যাশ যা করে তা ইতিমধ্যে আচ্ছাদিত, এবং 2. আজেবাজে কথা (বেশিরভাগ ফাইল সিস্টেমে "এমআইএমআই টাইপ" এর ধারণাও থাকে না, এমনকি তাদের থাকলেও এটি খুব অল্প তথ্য যুক্ত করে)।
sleske

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

আমি কেবল 1 এবং 3 পুনরায় তৈরি করি অনেক অর্থবোধ করি। (1) হ্যাশ গণনা করার প্রয়োজনীয়তা সংরক্ষণ করে বিভিন্ন ফাইলের বেশিরভাগ ক্ষেত্রে ফ্ল্যাগ আপ হবে। একই দৈর্ঘ্যের ফাইলে হ্যাশ সংঘর্ষ এতটা অসম্ভব যে এটি নিয়ে চিন্তা করার মতো নয়।
মাইকেল শ

1

অন্যরা যেমন বলেছে যে দুটি ফাইল একই সিস্টেমে থাকে তবে বাইট-বাই-বাইট তুলনা করা আরও দ্রুত। আপনি যদি একগুচ্ছ ফাইলের সাথে তুলনা করার চেষ্টা করছেন তবে ফাইলগুলি স্পিনিং স্টোরেজে থাকলে হ্যাশিংই ভাল উত্তর যেখানে আপনি পৌঁছাতে পারবেন।

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


0

আমি মনে করি আপনার সরবরাহকারী ফাইলটি আপনার অপারেটিং সিস্টেমের সাথে তুলনা ইউটিলিটি ব্যবহার করা উচিত বা বিষয়বস্তুর তুলনা করার জন্য একটি ফাইল তুলনা সরঞ্জাম (দেখুন: উইকি-ফাইল তুলনা সরঞ্জামগুলি ) ব্যবহার করা উচিত আপনি @ গ্লেন নেলসনের দ্বারা বর্ণিত ফাইলের বৈশিষ্ট্যগুলি পরীক্ষা করে নেওয়ার পরে।

আমি মনে করি না যে সিআরসি 100% নির্ভুল এবং আমি মনে করি ফাইলের দৈর্ঘ্যের সাথে এর যথার্থতা হ্রাস পেয়েছে। এছাড়াও, আমি আপনাকে এটিকে স্ক্র্যাচ থেকে লেখার পরামর্শ দিই না কারণ এর জন্য প্রচুর পরীক্ষার প্রয়োজন হতে পারে।


0

অনুলিপি করা ফাইলটি কি কোনও অনুলিপিযুক্ত ফাইলটি মূলের মতো কিনা তা পরীক্ষা করার জন্য কি প্রতিটি একক বাইট পড়তে হবে? হ্যাঁ 100% নিশ্চিত

অনুলিপি করা ফাইলটি কি কোনও অনুলিপিযুক্ত ফাইলটি মূলের মতো নয় কিনা তা পরীক্ষা করার জন্য কি প্রতিটি একক বাইট পড়তে হবে? কোন

সুতরাং, অ-পরিচয়টি দ্রুত নির্ধারণ করতে, প্রথমে ফাইলের আকারের মতো মেটাডেটা এবং OS / ফাইল-সিস্টেম / স্টোরটি ইতিমধ্যে রক্ষণাবেক্ষণ করতে পারে এমন কোনও চেকসাম / সিআরসি বা এমআইএমএম টাইপ পরীক্ষা করুন । যেহেতু সেগুলি সিস্টেমের দ্বারা প্রাক-গণনা করা হয়, তুলনা করার সময় আপনি এই ব্যয়টি প্রদান করবেন না।

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

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

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