2009-02-11 15 views
6

मैं एक फ़ाइल से एमडी 5, एसएचए और अन्य हैंश कैसे प्राप्त कर सकता हूं लेकिन केवल एक पास कर रहा हूं? मेरे पास 100 एमबी फाइलें हैं, इसलिए मैं उन 100 एमबी फाइलों को कई बार संसाधित करने से नफरत करता हूं।मैं केवल एक पास का उपयोग कर फ़ाइल के एकाधिक हैंश कैसे बना सकता हूं?

उत्तर

7

यहां @Jason S' suggestion का उपयोग करके संशोधित @ʞɔıu's answer है।

from __future__ import with_statement 
from hashlib import md5, sha1 

filename = 'hash_one-pass.py' 

hashes = md5(), sha1() 
chunksize = max(4096, max(h.block_size for h in hashes)) 
with open(filename, 'rb') as f: 
    while True: 
     chunk = f.read(chunksize) 
     if not chunk: 
      break 
     for h in hashes: 
      h.update(chunk) 

for h in hashes: 
    print h.name, h.hexdigest() 
15

शायद ऐसा कुछ?

>>> import hashlib 
>>> hashes = (hashlib.md5(), hashlib.sha1()) 
>>> f = open('some_file', 'r') 
>>> for line in f: 
...  for hash in hashes: 
...   hash.update(line) 
... 
>>> for hash in hashes: 
...  print hash.name, hash.hexdigest() 

या पाश f.read (1024) या ऐसा ही कुछ खत्म होने निश्चित लंबाई ब्लॉक

+0

की तरह यह काम करेगा, लेकिन मैं (कुछ बाइनरी फ़ाइलें पंक्ति विराम शामिल नहीं हो सकता) –

+0

f.readlines() की एक प्रति-लाइन आधार के बजाय एक निश्चित ब्लॉक आकार का उपयोग बाइट्स पढ़ें लग रहा है यही कारण है कि आवश्यकता है ~ 100 एमबी है, लेकिन एक मात्र 'एफ' काम करता है (फाइल ऑब्जेक्ट पाइथन में लाइनों पर एक पुनरावर्तक है) – jfs

+0

' फ़ाइल में * लाइनों पर एफ * iterates में लाइन के लिए। यदि रेखा का आकार 1 एमबी है तो इससे कोई फ़र्क नहीं पड़ता कि आप किस बफर आकार का उपयोग करते हैं; लेन (रेखा) 2 ** 20 होगी। इसलिए 'ओपन() 'के लिए तीसरा पैरामीटर इस मामले में उपयोगी नहीं है। – jfs

3

मैं अजगर पता नहीं है, लेकिन मैं परिचित w/हैश गणना कर रहा हूँ।

यदि आप मैन्युअल रूप से फ़ाइलों को पढ़ने में संभालते हैं, तो एक समय में केवल एक ब्लॉक (256 बाइट्स या 40 9 6 बाइट्स या जो कुछ भी) में पढ़ें, और प्रत्येक एल्गोरिदम के हैश को अद्यतन करने के लिए डेटा के प्रत्येक ब्लॉक को पास करें। (आपको शुरुआत में राज्य शुरू करना होगा और अंत में राज्य को अंतिम रूप देना होगा।)

संबंधित मुद्दे

 संबंधित मुद्दे