python - পাইথন মধ্যে বড় ফাইল MD5 হ্যাশ পান




hashlib (8)

@ পিয়টর সিজাপলা এর পদ্ধতির আমার সংস্করণ এখানে:

def md5sum(filename):
    md5 = hashlib.md5()
    with open(filename, 'rb') as f:
        for chunk in iter(lambda: f.read(128 * md5.block_size), b''):
            md5.update(chunk)
    return md5.hexdigest()

আমি hashlib ব্যবহার করেছি (যা পাইথন 2.6 / 3.0 এ md5 প্রতিস্থাপন করে) এবং যদি আমি একটি ফাইল hashlib.md5() এবং its content hashlib.md5() ফাংশনে hashlib.md5() তবে এটি ভাল কাজ করে।

সমস্যাটি তাদের বড় আকারের RAM ফাইলের আকার ছাড়িয়ে যেতে পারে।

কিভাবে মেমরিতে পুরো ফাইলটি লোড না করে MD5 হ্যাশ ফাইলটি পেতে হয়?


Django জন্য গৃহীত উত্তর বাস্তবায়ন:

import hashlib
from django.db import models


class MyModel(models.Model):
    file = models.FileField()  # any field based on django.core.files.File

    def get_hash(self):
        hash = hashlib.md5()
        for chunk in self.file.chunks(chunk_size=8192):
            hash.update(chunk)
        return hash.hexdigest()

আমি এখানে কাছাকাছি একটি বিট খুব fussing নেই নিশ্চিত নই। আমি সম্প্রতি md5 এবং মাইএসকিউএল-এ ব্লোব হিসাবে সংরক্ষিত ফাইলগুলির সাথে সমস্যা ছিল তাই আমি বিভিন্ন ফাইলের আকার এবং সহজতর পাইথন পদ্ধতির সাথে পরীক্ষা করলাম, যেমন:

FileHash=hashlib.md5(FileData).hexdigest()

আমি ফাইলের মাপের 2Kb থেকে 20Mb পর্যন্ত কোনও উল্লেখযোগ্য পারফরম্যান্স পার্থক্য সনাক্ত করতে পারিনি এবং তাই হাশিংয়ের 'অংশ' করার কোন প্রয়োজন নেই। যাইহোক, যদি লিনাক্সকে ডিস্কে যেতে হয় তবে সম্ভবত এটি কমপক্ষে কমপক্ষে প্রোগ্রামারের এটিকে এভাবে রাখতে সক্ষম হবে। যেমন ঘটেছিল, সমস্যাটি এমডি 5 এর সাথে কিছুই করার ছিল না। আপনি যদি মাইএসকিউএল ব্যবহার করেন তবে ইতিমধ্যে সেখানে md5 () এবং sha1 () ফাংশনগুলি ভুলবেন না।


এই থ্রেডে একাধিক মন্তব্য / উত্তর ব্যবহার করে, এখানে আমার সমাধান:

import hashlib
def md5_for_file(path, block_size=256*128, hr=False):
    '''
    Block size directly depends on the block size of your filesystem
    to avoid performances issues
    Here I have blocks of 4096 octets (Default NTFS)
    '''
    md5 = hashlib.md5()
    with open(path,'rb') as f: 
        for chunk in iter(lambda: f.read(block_size), b''): 
             md5.update(chunk)
    if hr:
        return md5.hexdigest()
    return md5.digest()
  • এটি "পাইথনিক"
  • এটি একটি ফাংশন
  • এটা নিরপেক্ষ মান এড়ানো: সবসময় স্পষ্ট বেশী পছন্দ।
  • এটা (খুব গুরুত্বপূর্ণ) পারফরমেন্স অপ্টিমাইজেশান অনুমতি দেয়

এবং পরিশেষে,

- এটি একটি সম্প্রদায় দ্বারা নির্মিত হয়েছে, আপনার পরামর্শ / ধারনাগুলির জন্য সবাইকে ধন্যবাদ।


ফাইলটি উপযুক্ত আকারের অংশে পড়তে হবে:

def md5_for_file(f, block_size=2**20):
    md5 = hashlib.md5()
    while True:
        data = f.read(block_size)
        if not data:
            break
        md5.update(data)
    return md5.digest()

দ্রষ্টব্য: নিশ্চিত করুন যে আপনি আপনার ফাইলটিকে 'আরবি' দিয়ে খোলা অবস্থায় খুলুন - অন্যথায় আপনি ভুল ফলাফল পাবেন।

তাই এক পদ্ধতিতে পুরোটা করতে - এরকম কিছু ব্যবহার করুন:

def generate_file_md5(rootdir, filename, blocksize=2**20):
    m = hashlib.md5()
    with open( os.path.join(rootdir, filename) , "rb" ) as f:
        while True:
            buf = f.read(blocksize)
            if not buf:
                break
            m.update( buf )
    return m.hexdigest()

উপরে আপডেট Frerich Raabe দ্বারা প্রদত্ত মন্তব্যগুলির উপর ভিত্তি করে ছিল - এবং আমি এটি পরীক্ষা করে দেখেছি এবং এটি আমার পাইথন 2.7.2 উইন্ডোজ ইনস্টলেশনে সঠিক বলে মনে হয়েছে।

আমি 'জ্যাকসাম' টুল ব্যবহার করে ফলাফলগুলি ক্রস-চেক করেছি।

jacksum -a md5 <filename>

http://www.jonelo.de/java/jacksum/


যদি আপনি আরো পাইথনিক (কোনও 'সত্যের সময়') সম্পর্কে ফাইলটি পড়ার উপায়টি এই কোডটি পরীক্ষা করে দেখুন:

import hashlib

def checksum_md5(filename):
    md5 = hashlib.md5()
    with open(filename,'rb') as f: 
        for chunk in iter(lambda: f.read(8192), b''): 
            md5.update(chunk)
    return md5.digest()

উল্লেখ্য যে ইটার () func এওএফ এ স্থগিত হওয়ার জন্য ফেরত ইটারারটারের জন্য একটি খালি বাইট স্ট্রিং প্রয়োজন, কারণ পড়ার () কেবল '' (কেবলমাত্র নয় '') প্রদান করে।


জেনেরিক হ্যাশিং ফাংশন সম্পর্কে হকিংয়ের মন্তব্য বিবেচনায় বস্টিয়ান সেমিনে কোডের একটি রিমিক্স ...

def hash_for_file(path, algorithm=hashlib.algorithms[0], block_size=256*128, human_readable=True):
    """
    Block size directly depends on the block size of your filesystem
    to avoid performances issues
    Here I have blocks of 4096 octets (Default NTFS)

    Linux Ext4 block size
    sudo tune2fs -l /dev/sda5 | grep -i 'block size'
    > Block size:               4096

    Input:
        path: a path
        algorithm: an algorithm in hashlib.algorithms
                   ATM: ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
        block_size: a multiple of 128 corresponding to the block size of your filesystem
        human_readable: switch between digest() or hexdigest() output, default hexdigest()
    Output:
        hash
    """
    if algorithm not in hashlib.algorithms:
        raise NameError('The algorithm "{algorithm}" you specified is '
                        'not a member of "hashlib.algorithms"'.format(algorithm=algorithm))

    hash_algo = hashlib.new(algorithm)  # According to hashlib documentation using new()
                                        # will be slower then calling using named
                                        # constructors, ex.: hashlib.md5()
    with open(path, 'rb') as f:
        for chunk in iter(lambda: f.read(block_size), b''):
             hash_algo.update(chunk)
    if human_readable:
        file_hash = hash_algo.hexdigest()
    else:
        file_hash = hash_algo.digest()
    return file_hash

import hashlib,re
opened = open('/home/parrot/pass.txt','r')
opened = open.readlines()
for i in opened:
    strip1 = i.strip('\n')
    hash_object = hashlib.md5(strip1.encode())
    hash2 = hash_object.hexdigest()
    print hash2




hashlib