यह अफ़सोस की बात है कि ओपनसेल उपयोगिता कई डाइजेस्ट कमांड को स्वीकार नहीं करती है; मुझे लगता है कि कई फाइलों पर एक ही कमांड का प्रदर्शन एक अधिक सामान्य उपयोग पैटर्न है। FWIW, मेरे सिस्टम (Mepis 11) पर खुलने वाली उपयोगिता का संस्करण केवल sha और sha1 के लिए है, अन्य sha के किसी भी संस्करण के लिए नहीं। लेकिन मेरे पास sha256sum, साथ ही md5sum नामक एक कार्यक्रम है।
यहाँ एक साधारण पायथन प्रोग्राम, dual_hash.py है, जो आपको चाहिए। 64k का ब्लॉक आकार मेरी मशीन के लिए इष्टतम प्रतीत होता है (Intel Pentium 4 2.00GHz 2G RAM के साथ), YMMV। छोटी फ़ाइलों के लिए, इसकी गति लगभग md5sum और उत्तराधिकार में sha256sum चलाने के समान है। लेकिन बड़ी फ़ाइलों के लिए यह काफी तेज है। उदाहरण के लिए, 1967063040 बाइट फ़ाइल (एमपी फाइलों से भरे एसडी कार्ड की एक डिस्क छवि) पर, md5sum + sha256sum लगभग 1m44.9s लेता है, dual_hash.py 1m0.33vs लेता है।
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))
मैं इस कार्यक्रम के एक C / C ++ संस्करण एक छोटे से तेजी से किया जाएगा लगता है, लेकिन बहुत ज्यादा नहीं है, क्योंकि काम के सबसे hashlib मॉड्यूल है, जिसके द्वारा किया जा रहा है है सी (या सी ++) में लिखा। और जैसा कि आपने ऊपर उल्लेख किया है, बड़ी फ़ाइलों के लिए टोंटी आईओ गति है।
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done