একটি পাইথন 2/3 পোর্টেবল সমাধান
একটি চেকসাম গণনা করতে (এমডি 5, শ 1, ইত্যাদি), আপনাকে অবশ্যই বাইনারি মোডে ফাইলটি খুলতে হবে, কারণ আপনি বাইটের মানগুলি যোগ করবেন:
Py27 / py3 পোর্টেবল হওয়ার জন্য আপনার io
প্যাকেজগুলি ব্যবহার করা উচিত :
import hashlib
import io
def md5sum(src):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
content = fd.read()
md5.update(content)
return md5
যদি আপনার ফাইলগুলি বড় হয়, আপনি মেমরির পুরো ফাইল সামগ্রী সংরক্ষণ করতে এড়াতে খণ্ডগুলি দ্বারা ফাইলটি পড়তে পছন্দ করতে পারেন:
def md5sum(src, length=io.DEFAULT_BUFFER_SIZE):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
return md5
এখানে কৌশলটি হ'ল সেন্ডিনেল (খালি স্ট্রিং) iter()
দিয়ে ফাংশনটি ব্যবহার করা ।
এই ক্ষেত্রে তৈরি করা ইটারেটর তার পদ্ধতিতে প্রতিটি কলের জন্য কোনও যুক্তি ছাড়াই ও [ল্যাম্বডা ফাংশন] কল করবে next()
; যদি ফেরত মানটি সেন্ডিনেলের সমান হয় StopIteration
তবে উত্থাপিত হবে, অন্যথায় মানটি ফিরে আসবে।
যদি আপনার ফাইলগুলি সত্যিই বড় হয় তবে আপনার অগ্রগতির তথ্যও প্রদর্শন করতে হতে পারে। আপনি কলব্যাক ফাংশন কল করে এটি করতে পারেন যা গণনা করা বাইটের পরিমাণ মুদ্রণ করে বা লগ করে:
def md5sum(src, callback, length=io.DEFAULT_BUFFER_SIZE):
calculated = 0
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
calculated += len(chunk)
callback(calculated)
return md5