একসাথে একাধিক হজম গণনা (এমডি 5, শ 256)?


25

এই ধারণাটি অনুসারে যে ডিস্ক আই / ও এবং ফ্রি র‌্যাম হ'ল একটি বাধা (যখন সিপিইউ সময় সীমাবদ্ধতা নয়), এমন একটি সরঞ্জাম কি বিদ্যমান যা একসাথে একাধিক বার্তা হজম করতে পারে?

আমি বিশেষত সমান্তরালে বড় ফাইলের (গিগাবাইটের আকার) এর MD-5 এবং SHA-256 হজম গণনা করতে আগ্রহী। আমি চেষ্টা করেছি openssl dgst -sha256 -md5, তবে এটি কেবল একটি অ্যালগরিদম ব্যবহার করে হ্যাশ গণনা করে।

প্রত্যাশিত আচরণের জন্য সিউডো-কোড:

for each block:
    for each algorithm:
        hash_state[algorithm].update(block)
for each algorithm:
    print algorithm, hash_state[algorithm].final_hash()

আপনি কেবল পটভূমিতে একটি উদাহরণ শুরু করতে পারেন, তারপরে উভয় হ্যাশ সমান্তরালে চলবে:for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done
মার্কো

2
@ মার্কো এই পদ্ধতির সাথে সমস্যাটি হ'ল একটি কমান্ড অন্যটির চেয়ে দ্রুততর হতে পারে, যার ফলে ডিস্ক ক্যাশে হয়ে যায় যা পরে একই ডেটা দিয়ে খালি হয়ে যায় এবং পুনরায় পূরণ করা হয়।
লেকেনস্টেইন

1
আপনি যদি ডিস্ক ক্যাশে সম্পর্কে চিন্তিত হন তবে আপনি কেবল একবার ফাইলটিতে পড়তে পারেন: for i in file1 file2 …; do tee < "$i" >(sha256sum) | md5sum ; doneতারপরে আপনাকে ফাইলের নাম চিহ্নিত করতে অতিরিক্ত কোড যুক্ত করতে হবে, কারণ এটি স্ট্যান্ডার্ড ইনপুট হিসাবে প্রেরণ করা হয় md5sumএবং sha256sum
মার্কো

উত্তর:


28

pee(" tee standard input to pipes") থেকে পরীক্ষা করে দেখুন moreutils। এটি মূলত মার্কোর teeকমান্ডের সমতুল্য , তবে টাইপ করা একটু সহজ ler

$ echo foo | pee md5sum sha256sum
d3b07384d113edec49eaa6238ad5ff00  -
b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c  -
$ pee md5sum sha256sum <foo.iso
f109ffd6612e36e0fc1597eda65e9cf0  -
469a38cb785f8d47a0f85f968feff0be1d6f9398e353496ff7aa9055725bc63e  -

দুর্দান্ত আদেশ! আমি ইতিমধ্যে এই খুব দরকারী প্যাকেজ ইনস্টল করা আছে, এই মজার-নামক ইউটিলিটি সম্পর্কে জানতাম না।
লেকেনস্টেইন

1
peeসেরা ইন্টারফেস রয়েছে, অন্যান্য সরঞ্জামের সাথে সময়ের তুলনা এই পোস্টে পাওয়া যাবে যা একটি বহু-থ্রেডযুক্ত পাইথন সরঞ্জামটি প্রদর্শন করে।
লেকেনস্টেইন

দুর্ভাগ্যক্রমে, আমার ডেবিয়ান সিস্টেমের moreutilsসাথে দ্বন্দ্ব GNU parallel… যদিও, এই জাতীয় সরঞ্জাম রয়েছে তা জানা ভাল।
লাইওরি

@ লেকেনস্টেইন: আমি প্যাকেজ স্তরে দ্বন্দ্ব পেয়েছি (যেমন। aptitudeআমাকে একই সময়ে দুটি প্যাকেজ থাকতে দেয় না)।
লাইওরি

@ লিওরি খুব খারাপ যে ডেবিয়ান সেভাবে এটি প্রয়োগ করেছিল, এটিতে একটি বাগ ফাইল করা উপযুক্ত হবে। আর্ক লিনাক্সে moreutils-parallelদ্বন্দ্ব এড়ানোর জন্য একটি নাম রয়েছে।
লেকেনস্টেইন

10

আপনি forপৃথক ফাইলগুলি লুপ করতে একটি লুপ ব্যবহার করতে পারেন এবং তারপরে tee বিভিন্ন চেকসামারগুলিতে পাইপ দেওয়ার জন্য প্রক্রিয়া প্রতিস্থাপনের (বাশ এবং অন্যদের মধ্যে জেডে কাজ করে) একত্রে ব্যবহার করতে পারেন ।

উদাহরণ:

for file in *.mkv; do
  tee < "$file" >(sha256sum) | md5sum
done

আপনি আরও দুটি চেকসামার ব্যবহার করতে পারেন:

for file in *.mkv; do
  tee < "$file" >(sha256sum) >(sha384sum) | md5sum
done

এটির অসুবিধা রয়েছে যে চেকসামাররা ফাইলের নাম জানেন না, কারণ এটি স্ট্যান্ডার্ড ইনপুট হিসাবে পাস করা হয়েছে। যদি তা গ্রহণযোগ্য না হয় তবে আপনাকে ফাইলের নাম ম্যানুয়ালি নির্গত করতে হবে। সম্পূর্ণ উদাহরণ:

for file in *.mkv; do
  echo "$file"
  tee < "$file" >(sha256sum) >(sha384sum) | md5sum
  echo
done > hashfilelist

1
*sumসরঞ্জামগুলির পরিবারের সাথে আউটপুটকে সামঞ্জস্য করতে এই পরিবর্তিত অভিব্যক্তিটি এর পরিবর্তে ব্যবহার করা যেতে পারে: sed "s;-\$;${file//;/\\;};( -ফাইলের নাম অনুসারে স্থান পরিবর্তন করে, তবে নিশ্চিত করুন যে ফাইলের নামটি যথাযথভাবে পালাতে পারে)।
লেকেনস্টেইন

আফিক্স, এটি কেবলমাত্র কাজ করে zsh। Ksh93 এবং ব্যাশে, sha256sum এর আউটপুট md5sum এ যায়। আপনি চাইবেন: { tee < "$file" >(sha256sum >&3) | md5sum; } 3>&1। বিপরীত সমস্যার জন্য unix.stackexchange.com/q/153896/22565 দেখুন ।
স্টাফেন চ্যাজেলাস

6

এটি দুঃখের বিষয় যে ওপেনসেল ইউটিলিটি একাধিক ডাইজেস্ট কমান্ড গ্রহণ করে না; আমার ধারণা একাধিক ফাইলে একই কমান্ডটি করা আরও সাধারণ ব্যবহারের ধরণ pattern এফডব্লিউআইডাব্লু, আমার সিস্টেমে ওপেনসেল ইউটিলিটির সংস্করণ (মেপিস 11) কেবল শ এবং শ 1 এর জন্য কেবল কমান্ড রয়েছে, অন্য কোনও শ রূপগুলি নয়। তবে আমার কাছে sha256sum নামে একটি প্রোগ্রাম রয়েছে, পাশাপাশি এমডি 5সাম।

এখানে একটি সাধারণ পাইথন প্রোগ্রাম, ডুয়াল_হ্যাশ.পি, এটি আপনার যা চায় তা করে। আমার মেশিনের জন্য 64k এর একটি ব্লক আকারটি সর্বোত্তম বলে মনে হচ্ছে (ওয়াইএমএমভি, 2 জি র‌্যামের সাথে ইন্টেল পেন্টিয়াম 4 2.00GHz)। ছোট ফাইলগুলির জন্য, এর গতি মোটামুটি একইভাবে md5sum এবং ধারাবাহিকভাবে sha256sum চলমান। তবে বড় ফাইলগুলির জন্য এটি উল্লেখযোগ্যভাবে দ্রুত। উদাহরণস্বরূপ, 1967063040 বাইট ফাইলের (এমপি 3 ফাইল পূর্ণ এসডি কার্ডের একটি ডিস্ক চিত্র), md5sum + sha256sum প্রায় 1m44.9 সেকেন্ড নেয়, ডুয়াল_হ্যাশ.পি লাগে 1m0.312।

dual_hash.py

#! /usr/bin/env python

''' Calculate MD5 and SHA-256 digests of a file simultaneously

    Written by PM 2Ring 2014.10.23
'''

import sys
import hashlib

def digests(fname, blocksize):
    md5 = hashlib.md5()
    sha = hashlib.sha256()
    with open(fname, 'rb') as f:
        while True:
            block = f.read(blocksize)
            if not block:
                break
            md5.update(block)
            sha.update(block)

    print("md5: %s" % md5.hexdigest())
    print("sha256: %s" % sha.hexdigest())

def main(*argv):
    blocksize = 1<<16 # 64kB
    if len(argv) < 2:
        print("No filename given!\n")
        print("Calculate md5 and sha-256 message digests of a file.")
        print("Usage:\npython %s filename [blocksize]\n" % sys.argv[0])
        print("Default blocksize=%d" % blocksize)
        return 1

    fname = argv[1]

    if len(argv) > 2:
        blocksize = int(sys.argv[2])

    print("Calculating MD5 and SHA-256 digests of %r using a blocksize of %d" % (fname, blocksize))
    digests(fname, blocksize)

if __name__ == '__main__':
    sys.exit(main(*sys.argv))

আমি এই কর্মসূচির একটি সি / সি ++ সংস্করণ একটু দ্রুত হবে অনুমান, কিন্তু অনেক না, যেহেতু কাজ অধিকাংশ hashlib মডিউল দেখবেন, যার দ্বারা সম্পন্ন করা হচ্ছে হয় সি (অথবা সি ++) তে লিখিত। এবং আপনি উপরে উল্লিখিত হিসাবে, বড় ফাইলগুলির জন্য বাধা হ'ল IO গতি।


২.৩ জি ফাইলের জন্য, এই সংস্করণটির তুলনায় তুলনাযোগ্য গতি ছিল md5sumএবং sha256sumএকত্রিত হয়েছিল (এই পাইথন স্ক্রিপ্টের জন্য ১৮.7 বনাম ৪.7 এস + ১৪.২ এস, ক্যাশে ফাইল; ঠান্ডা রানের জন্য ৩৩..6 এস) 64KiB বনাম 1MiB পরিস্থিতি পরিবর্তন করেনি। কোড মন্তব্য করা সহ, 5.1 গুলি m15 (n = 3), 141 গুলি sha1 (n = 3) এ ব্যয় হয়েছিল। 8 গিগাবাইট র‌্যাম সহ একটি আই 5-460 এম-তে পরীক্ষা করা হয়েছে। আমি অনুমান করি যে আরও থ্রেড ব্যবহার করে এটি আরও উন্নত করা যেতে পারে।
লেকেনস্টেইন

ওপেনএসএসএল মডিউলে যেভাবে রান-টাইম ব্যয় করা হয়েছে (হ্যাশলিব দ্বারা ব্যবহৃত) সে ক্ষেত্রে সি বা সি ++ সম্ভবত কিছু যায় আসে না। আরও থ্রেড গতি উন্নত করে, একটি বহু-থ্রেড পাইথন স্ক্রিপ্ট সম্পর্কে এই পোস্টটি দেখুন ।
লেকেনস্টেইন

@ পিএম 2 রিং - কেবল একটি নোট। আপনার হজম () ফাংশনে মুদ্রণ বিবরণীর পরে, আপনাকে কমপক্ষে শ পরিষ্কার করতে হবে। আপনার এমডি 5 সাফ করা উচিত কিনা তা আমি বলতে পারি না। আমি কেবল "ডেল শা" ব্যবহার করব। আপনি যদি না করেন তবে প্রথমটির পরে প্রতিটি ফাইলের একটি ভুল হ্যাশ থাকবে। এটি প্রমাণ করতে, একটি টিএমপি দির তৈরি করুন এবং এটিতে একটি ফাইল অনুলিপি করুন। এখন সেই ফাইলটির 2 টি অনুলিপি তৈরি করুন এবং আপনার স্ক্রিপ্টটি চালান। আপনি 3 টি ভিন্ন হ্যাশ পাবেন যা আপনি চান তা নয়। সম্পাদনা: আমি ভেবেছিলাম ফাংশনটি ফাইলের সেটগুলিতে পড়ছে, কেবল একবারে একটি ফাইল পড়ছে না ... এই ব্যবহারের জন্য অবহেলা করুন। ;)
টেরি ওয়ান্টেট

1
@ টেরিভেন্ড্ট আপনি সেখানে আমাকে এক সেকেন্ডের জন্য চিন্তিত করেছিলেন। :) হ্যাঁ, digestsপ্রতিটি কলটিতে কেবল একটি একক ফাইল প্রক্রিয়া করে। এমনকি আপনি যদি এটিকে কোনও লুপে কল করেন তবে তা প্রতিটি কলটিতে নতুন এমডি 5 তৈরি করে এবং প্রসঙ্গ তৈরি করে। FWIW, আপনি আমার পুনঃসূচনাযোগ্য SHA-256 হ্যাশ উপভোগ করতে পারেন ।
প্রধানমন্ত্রী 2Ring

5

আপনি সর্বদা জিএনইউ সমান্তরাল জাতীয় কিছু ব্যবহার করতে পারেন :

echo "/path/to/file" | parallel 'md5sum {} & sha256sum {}'

বিকল্পভাবে, ব্যাকগ্রাউন্ডে কেবল দুটির মধ্যে একটি চালান:

md5sum /path/to/file & sha256sum /path/to/file

অথবা, আউটপুটটি বিভিন্ন ফাইলে সংরক্ষণ করুন এবং ব্যাকগ্রাউন্ডে একাধিক কাজ চালান:

for file in *; do
    md5sum "$file" > "$file".md5 &
    sha256sum "$file" > "$file".sha &
done

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


1
মার্কোর মন্তব্য দেখুন, আমার উদ্বেগ হ'ল আদেশটি সমান্তরাল হলেও, স্লো ডিস্ক একই ডেটার জন্য দুবার অ্যাক্সেস হয়ে যায়।
লেকেনস্টেইন

কিন্তু ডিস্ক ক্যাশের অস্তিত্ব কি আপনার উদ্বেগগুলিকে অযৌক্তিক করে তুলবে না?
টুইঙ্কলস

2
@ টিউঙ্কলস উপরের লেকেনস্টেইনের উদ্ধৃতি দিতে, "এই পদ্ধতির সাথে সমস্যাটি হ'ল একটি কমান্ড অন্যটির চেয়ে দ্রুততর হতে পারে, যার ফলে ডিস্ক ক্যাশে হয়ে যায় এবং পরে একই ডেটা দিয়ে তা পুনরায় পূরণ করা হয়" "
ম্যাট নর্ডহফ

2
@ ম্যাটনার্ডফ আরও একটি বিষয় বুদ্ধিমান আই / ও শিডিউলের উচিত এবং এটির জন্য অপ্টিমাইজ করা উচিত। কেউ ভাবতে পারেন: "আই / ও শিডিয়ুলারের পক্ষে এই দৃশ্যটিকে বিবেচনায় নেওয়া কতটা কঠিন হতে পারে?" তবে পর্যাপ্ত ভিন্ন পরিস্থিতিতে একটি আই / ও শিডিয়ুলারের বিবেচনা করা উচিত, এটি হঠাৎ করেই একটি কঠিন সমস্যা হয়ে দাঁড়ায়। সুতরাং আমি একমত যে কেসিং সমস্যার যত্ন নেবে এমন ধারণা করা উচিত নয়।
কাস্পারড

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

3

Curiousity একটি মাল্টি-থ্রেডেড পাইথন স্ক্রিপ্ট চালাতে সময় কমে যাবে কিনা আউট, আমি এই তৈরি digest.pyস্ক্রিপ্ট ব্যবহার threading.Thread, threading.Queueএবং hashlibএকাধিক ফাইল জন্য হ্যাশ গণনা করা হবে।

মাল্টি-থ্রেড পাইথন বাস্তবায়ন peeকোর্টিল ব্যবহারের চেয়ে কিছুটা দ্রুত । অন্যদিকে জাভা হ'ল ... মেহ। ফলাফল এই প্রতিশ্রুতি বার্তায় পাওয়া যায় :

তুলনার জন্য, ২.৩ জিবি-র একটি ফাইলের জন্য (মিনিট / গড় / সর্বোচ্চ / এসডি সেকেন্ড n = 10 এর জন্য):

  • pee sha256sum md5sum <ফাইল: 16.5 / 16.9 / 17.4/ .305
  • পাইথন 3 ডাইজেস্ট.পি -sha256-এমডি 5 <ফাইল: 13.7 / 15.0 / 18.7 / 1.77
  • পাইথন 2 ডাইজেস্ট.পি -sha256-এমডি 5 <ফাইল: 13.7 / 15.9 / 18.7 / 1.64
  • জ্যাকসুম -a sha256 + এমডি 5 -F '# CHECKSUM {i} #FILENAME': 32.7 / 37.1 /50/6.91

হ্যাশ আউটপুট কোর্টিলস দ্বারা উত্পাদিত আউটপুট সাথে সামঞ্জস্যপূর্ণ। যেহেতু দৈর্ঘ্য হ্যাশিং অ্যালগরিদমের উপর নির্ভরশীল, তাই এই সরঞ্জামটি এটি মুদ্রণ করে না। ব্যবহার (তুলনা করার জন্য, peeযোগ করা হয়েছিল):

$ ./digest.py -sha256 -md5 digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  digest.py
b575edf6387888a68c93bf89291f611c  digest.py
$ ./digest.py -sha256 -md5 <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -
$ pee sha256sum md5sum <digest.py
c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2  -
b575edf6387888a68c93bf89291f611c  -

আমি তুলনা করার পরামর্শ দিতে যাচ্ছিলাম pee "openssl sha256" "openssl md5" < file, তবে, সত্যি বলতে, আমি কেবল এটি চেষ্টা করেছিলাম, এবং এটি ডাইজেস্ট.পাইকে পরাজিত করেনি। যদিও ব্যবধানটি সংকুচিত করে।
ম্যাট নর্ডহফ

1

জ্যাকসাম চেকসাম, সিআরসি এবং হ্যাশগুলি (বার্তা হজম করে) পাশাপাশি ফাইলগুলির টাইমস্ট্যাম্পগুলি গণনা ও যাচাই করার জন্য একটি নিখরচায় এবং প্ল্যাটফর্মের স্বাধীন ইউটিলিটি। ( জ্যাক্সাম ম্যান পৃষ্ঠা থেকে উদ্ধৃত )

এটি বৃহত ফাইল সচেতন, এটি 8 এক্সপাইট (= 8,000,000,000 গিগাবাইট) পর্যন্ত ফাইলগুলি প্রক্রিয়া করতে পারে, অনুমান করা হয় যে আপনার অপারেটিং সিস্টেম যথাক্রমে আপনার ফাইল সিস্টেমটিও বড় ফাইল সচেতন। ( http://www.jonelo.de/java/jacksum/ থেকে উদ্ধৃত )

ব্যবহারের উদাহরণ:

jacksum -a md5+sha256 -F "#ALGONAME{i} (#FILENAME) = #CHECKSUM{i}" jacksum-testfile

নমুনা আউটপুট:

md5 (jacksum-testfile) = d41d8cd98f00b204e9800998ecf8427e
sha256 (jacksum-testfile) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

উবুন্টুতে, apt-get install jacksumএটি পেতে কমান্ডটি চালান ।

বিকল্পভাবে, সোর্স কোডগুলি এখানে উপলব্ধ


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