Hash-Werte aus Dateien ermitteln, und dann...?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Nun, ich habe mir mal den Spaß erlaubt, und bei Sirius3s Variante überall eine Print-Anweisung anzusetzen, um mitverfolgen zu können, wie das Skript arbeitet. Mir fiel sehr stark auf, dass das Skript äußerst langsam arbeitet. Dabei ist meine Zip-Datei derzeit nur 34 MB groß. Ich vermute mal, dass Sirius3s Variante sehr stark ausgebremst wird?

Code: Alles auswählen

def new_one_digest(prompt):
    print "Starting to hash"
    print "Path", prompt
    with open(prompt, 'rb') as data:
        print "data", data
        sha = hashlib.sha512()
        for chunk in iter(lambda: data.read(65536), bool):
            print "chunk", chunk
            sha.update(chunk)
        digest = sha.hexdigest()

    return digest

Also bleibt mir nichts anderes übrig, als diese Variante zu nehmen?

Code: Alles auswählen

def hash_zip(prompt):

    with open(prompt, 'rb') as f:
        digest = hashlib.sha512(f.read()).hexdigest()
        print "digest", digest
        return digest
Denn so wie BlackJack und kbr es mir erklärt haben, verändert sich das Archiv ebenfalls, sobald sich eine Datei im Archiv ändert.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast *immer noch* einen Fehler in deiner Schleife, bei der du "bool" statt "''" uebergibst. Damit ist deine Abbruchbedingung falsch, und das fuehrt dann zu einer kleinen Endlosschleife - die dauert tatsaechlich etwas laenger.

Denn ansonsten sind die beiden Ansaetze gleich & es wuerde mich auch sehr wundern, wenn die Performance da gross unterschiedlich ist.

Was dass dann wiederum mit deiner Schlussfolgerung am Ende zu tun hat, weiss ich auch nicht...
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Um dieses letzte Argument in der iter()-Methode zu verstehen, versuche ich das mal nachzuvollziehen.

Code: Alles auswählen

for chunk in iter(lambda: data.read(65536), bool):
Innerhalb des Iteratorobjektes wird eine anonyme Funktion (Lambda) erzeugt. Hier hat lambda keine Argumentationsliste, die vor dem Doppelpunkt stehen. Anschließend folgt ein Ausdruck, und zwar, dass das Objekt data (hier: Zip-Datei) gelesen wird. In der read()Methode wird dann die Anzahl der Bytes übergeben, die gelesen werden sollen. Und in bool können nun zwei Werte, einmal True oder False enthalten sein. Eigentlich dient das letzte Argument der iter()-Methode dazu, um diese For-Schleife bei einer bestimmten Bedingung abzubrechen.

Habe ich das alles so richtig verstanden?
BlackJack

@Sophus: Das letzte Argument ist in dem gezeigten Quelltext der Typ `bool`, der kann nicht zwei Werte enthalten der ist selber *ein* Wert. Und zwar, wie schon gesagt, der *falsche* Wert. Richtig wäre eine leere Zeichenkette beziehungsweise Bytekette.
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sophus hat geschrieben:Um dieses letzte Argument in der iter()-Methode zu verstehen, versuche ich das mal nachzuvollziehen.
Ein alternativer Ansatz: Dokumentation lesen:

Code: Alles auswählen

$ pydoc iter
Help on built-in function iter in module __builtin__:

iter(...)
    iter(collection) -> iterator
    iter(callable, sentinel) -> iterator

    Get an iterator from an object.  In the first form, the argument must
    supply its own iterator, or be a sequence.
    In the second form, the callable is called until it returns the sentinel.
(END)
Antworten