আমি পরিষ্কারভাবে মৌলিকভাবে নতুন কিছু যোগ করছি না, তবে আমি মন্তব্য উত্তর দেওয়ার আগে এই উত্তরটি যুক্ত করেছি, এবং কোড অঞ্চলগুলি বিষয়গুলিকে আরও স্পষ্ট করে তোলে - যাইহোক, বিশেষত সর্বজ্ঞতার উত্তর থেকে নিমোর প্রশ্নের উত্তর দেওয়ার জন্য:
আমি চেকসামগুলি সম্পর্কে কিছুটা ভাবছিলাম (ব্লকের আকারগুলি সম্পর্কে বিশেষত পরামর্শের জন্য এখানে এসেছি), এবং আমি পেয়েছি যে এই পদ্ধতিটি আপনার প্রত্যাশার চেয়ে দ্রুত হতে পারে। প্রায় দ্রুত (তবে বেশ সাধারণ) গ্রহণ করা timeit.timeit
বা /usr/bin/time
প্রায় একটি ফাইল চেকসুম করার বিভিন্ন পদ্ধতির প্রতিটি থেকে ফলাফল। 11MB:
$ ./sum_methods.py
crc32_mmap(filename) 0.0241742134094
crc32_read(filename) 0.0219960212708
subprocess.check_output(['cksum', filename]) 0.0553209781647
md5sum_mmap(filename) 0.0286180973053
md5sum_read(filename) 0.0311000347137
subprocess.check_output(['md5sum', filename]) 0.0332629680634
$ time md5sum /tmp/test.data.300k
d3fe3d5d4c2460b5daacc30c6efbc77f /tmp/test.data.300k
real 0m0.043s
user 0m0.032s
sys 0m0.010s
$ stat -c '%s' /tmp/test.data.300k
11890400
সুতরাং, দেখে মনে হচ্ছে পাইথন এবং / usr / bin / md5sum উভয়ই 11MB ফাইলের জন্য 30 মিমি নিয়ে থাকে। প্রাসঙ্গিক md5sum
ফাংশন ( md5sum_read
উপরের তালিকায়) সর্বশক্তিমানের সাথে বেশ অনুরূপ:
import hashlib
def md5sum(filename, blocksize=65536):
hash = hashlib.md5()
with open(filename, "rb") as f:
for block in iter(lambda: f.read(blocksize), b""):
hash.update(block)
return hash.hexdigest()
মঞ্জুরিপ্রাপ্ত, এটি একক রান থেকে হয় ( mmap
কমপক্ষে কয়েক ডজন রান করা হলে এটি সর্বদা দ্রুততর হয়) এবং f.read(blocksize)
বাফার শেষ হয়ে যাওয়ার পরে আমার সাধারণত অতিরিক্ত অতিরিক্ত হয়ে যায়, তবে এটি যুক্তিসঙ্গত পুনরাবৃত্তিযোগ্য এবং দেখায় যে md5sum
কমান্ড লাইনে রয়েছে অজগর বাস্তবায়নের চেয়ে দ্রুত প্রয়োজন হয় না ...
সম্পাদনা: দীর্ঘ বিলম্বের জন্য দুঃখিত, কিছু সময় এটির দিকে নজর দেওয়া হয়নি, তবে @ এডরান্ডাল এর প্রশ্নের উত্তর দেওয়ার জন্য, আমি একটি অ্যাডলার 32 বাস্তবায়ন লিখব। যাইহোক, আমি এর জন্য মানদণ্ড পরিচালনা করি না। এটি মূলত সিআরসি 32 এর মতোই ছিল: আরকি, আপডেট এবং ডাইজেস্ট কলগুলির পরিবর্তে সমস্ত কিছু zlib.adler32()
কল:
import zlib
def adler32sum(filename, blocksize=65536):
checksum = zlib.adler32("")
with open(filename, "rb") as f:
for block in iter(lambda: f.read(blocksize), b""):
checksum = zlib.adler32(block, checksum)
return checksum & 0xffffffff
নোট করুন যে এটি অবশ্যই শূন্য স্ট্রিং দিয়ে শুরু করা উচিত, কারণ অ্যাডলারের যোগফলগুলি শূন্য থেকে বনাম যখন তাদের যোগফলের চেয়ে আলাদা হয় তবে ""
এটি হয় 1
- 0
পরিবর্তে সিআরসি শুরু করতে পারে । AND
-Ing এটি একটি 32 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যা, যা এটি পাইথন সংস্করণ জুড়ে একই মান নিশ্চিত করে করতে প্রয়োজন হয়।
md5sum
করবেন না কেন ?