sha1 wird nicht korrekt berrechnet

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
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

Hi @all,

Wo liegt der Fehler?
Ich wollte ein Konsolenprogramm schreiben, welches den Dateinamen übergeben bekommt und daraufhin, md5, sha1 usw. berrechnet. Jedoch berrechnet er nicht den korrekten Wert. Ich poste einfach mal den Code. Was habe ich falsch verstanden?

Code: Alles auswählen

import sys
import hashlib


datei = open(sys.argv[1],"r")

stdin = raw_input("Bitte geben Sie md5, sha1, sha256 oder sha512 an >>> ")

if stdin=='md5':
        for dat in datei.read():
                pass
        print hashlib.md5(dat).hexdigest()
elif stdin=='sha1':
        for dat in datei.read():
                pass
        print hashlib.sha1(dat).hexdigest()
elif stdin=='sha256':
        for dat in datei.read():
                pass
        print hashlib.sha256(dat).hexdigest()
elif stdin=='sha512':
        for dat in datei.read():
                pass
        print hashlib.sha512(dat).hexdigest()
else:
    print "Bitte nur md5, sha1, sha256, sha512 angeben!!!"
    
datei.close()
Zuletzt geändert von Anonymous am Dienstag 3. August 2010, 17:25, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Erstens öffnest du die Dateien nicht im Binärmodus (geht mit "rb" statt "r") dann können komische Sachen mit den Zeilenumbrüchen passieren und zweitens berechnest du immer nur den Hashwert des letzten Buchstaben, lass die for-Schleife weg.
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

@Darii ey cool dank dir! Funktioniert jetzt tadellos!!!

Gruß
BlackJack

@3quin0x: Das ginge wesentlich kürzer mit `hashlib.new()`.
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

@Black Jack ..danke ,jetzt ist das Prog nur noch 4 Zeilen lang
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Vielleicht könntest du dir auch mal die update() Funktion ansehen: Momentan beförderst du ja den gesamten Dateiinhalt in den Speicher - das wird bei (sehr) großen Dateien zu Problemen führen.

Einen schönen Gruß,

brb

P.S.
Rein unix-philosophie-mäßig fände ich es auch netter, wenn man die zu verwendete Methode über einen Parameter bestimmen könnte. Lässt sich viel besser skripten ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Barabbas hat geschrieben: P.S.
Rein unix-philosophie-mäßig fände ich es auch netter, wenn man die zu verwendete Methode über einen Parameter bestimmen könnte. Lässt sich viel besser skripten ;)
Und wenn man schon dabei ist, schadet das argparse bzw. optparse-Modul nicht :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Hyperion hat geschrieben:Und wenn man schon dabei ist, schadet das argparse bzw. optparse-Modul nicht :-)
http://docs.python.org/library/optparse.html hat geschrieben:Deprecated since version 2.7: The optparse module is deprecated and will not be developed further; development will continue with the argparse module.
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dav1d hat geschrieben:
Hyperion hat geschrieben:Und wenn man schon dabei ist, schadet das argparse bzw. optparse-Modul nicht :-)
http://docs.python.org/library/optparse.html hat geschrieben:Deprecated since version 2.7: The optparse module is deprecated and will not be developed further; development will continue with the argparse module.
Das ist mir klar! Aber ich weiß ja nicht, welche Version der OP benutzt. 2.7 ist ja relativ neu... (daher habe ich optparse ja auch mit bzw. nachgestellt!)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich wollt's nur mal erwähnt haben, so als Zusatzinformation
the more they change the more they stay the same
Antworten