Hash Di Un File Con Python

Per ottenere l'hash di un file (in questo caso MD5, che pur in tutti i limiti di sicurezza che sono stati trovati, rimane comunque validissimo per generare hash tendenzialmente univoci anche su grandi quantità di file), Python usa il modulo hashlib della libreria standard. Nell'esempio, riciclato da qualche post trovato su internet di cui non conosco l'autore, viene considerata la possibilità che il file sia di grandi dimensioni, e invece che caricarlo completamente in memoria, visto che potremmo trovare file di molti gigabyte, viene letto a blocchi. L'utilità di avere un hash per un file, nel mio caso, è connessa all'avere grandi quantità di dati sui dischi. Potrebbe sempre succedere che, per qualsiasi motivo, un file si corrompa, o venga sovrascritto, anche se fortunatamente il mancato uso di Windows mi ha tutelato. Mettiamo alcuni di questi problemi nella mia libreria musicale: oltre 120000 brani, di cui compio con regolarità le procedure di backup, ma che mi espongono, visto che non li ascolto certo tutti continuamente in breve tempo, ad accorgermi dei problemi anche dopo mesi. Notare, io, ai miei file, voglio bene :) Oltre al fare le copie, queste sono fatte anche in modo multiplo, su hd e bluray, e i dischi sono ben ventilati. In questo caso, un controllo automatico (uso infatti cron e faccio scorrere gli script, bash o python, nella nottata) può salvarti la vita.

import hashlib
def getfilehash(nomefile):
    bsize = 65536
    kindofhash = hashlib.md5()
    with open(nomefile, 'rb') as afile:
        buffer = a.read(bsize)
        while len(buf) > 0:
            kindofhash.update(buffer)
            buffer = a.read(bsize)
    return kindofhash.hexdigest()

Un'altra versione, piu' "circoscritta", che sfrutta le Lambda di Py3:

import hashlib
def filemd5(fname):
    hash = hashlib.md5()
    with open(fname, "rb") as f:
        for buffer in iter(lambda: f.read(4096), b""):
            hash.update(buffer)
    return hash.hexdigest()

Il CRC32

A volte CRC32 puo' bastare: e nel caso, ecco:

def filecrc(filename):
    buffer = open(filename,'rb').read()
    buffer = (binascii.crc32(buffer) & 0xFFFFFFFF)
    return "%08X" % buffer