Hashwert einer Datei ermitteln?!

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.
Gast

Wollte einmal kurz fragen, wie ich den Hashwert einer Datei ermitteln kann?
hab keinen speziellen algo im auge, mir ist nur wichtig eine zeichenkette zu erhalten, die eine datei genau identifiziert

moderiert von blackbird: verschoben ;-/
Gast

ich bins nochmal^^
das ganze sollte in python geschrieben sein^^
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Anonymous hat geschrieben:mir ist nur wichtig eine zeichenkette zu erhalten, die eine datei genau identifiziert
Hi!

Suche in der Hilfe nach "sha".

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wenn es auch eine MD5 Checksum sein kann, dann schau mal hier: http://www.jensdiemer.de/Programmieren/ ... ets/md5sum

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Anonymous hat geschrieben:eine zeichenkette zu erhalten, die eine datei genau identifiziert
Genau aka 100% geht das natürlich nicht, ansonsten hättest du ja eine geniale Kompression ;)
BlackJack

Streng genommen liefert der folgende Schnipsel eine Zeichenkette, welche die Datei genau identifiziert: :twisted:

Code: Alles auswählen

fileobj = open('dateiname', 'rb')
id_str = fileobj.read()
fileobj.close()
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Das ist aber uneffektiv! Viel besser ist:

Code: Alles auswählen

id_str = bz2.compress(fileobj.read())
:-P
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Joghurt hat geschrieben:Das ist aber uneffektiv! Viel besser ist:

Code: Alles auswählen

id_str = bz2.compress(fileobj.read())
:-P
Ich weis nicht. Kommt auf die definition von effektiv an. Wenns um Geschwindigkeit geht, dann ist das alles andere, als effektiv.
BlackJack

ProgChild hat geschrieben:
Joghurt hat geschrieben:Das ist aber uneffektiv! Viel besser ist:

Code: Alles auswählen

id_str = bz2.compress(fileobj.read())
:-P
Ich weis nicht. Kommt auf die definition von effektiv an. Wenns um Geschwindigkeit geht, dann ist das alles andere, als effektiv.
Effektiv hat mit Geschwindigkeit nix zu tun. Effektiv ist etwas, wenn es den gewünschten Effekt hat, und das haben beide Varianten. Du verwechselst das wahrscheinlich gerade mit effizient. Da kommt's dann in der Tat darauf an, ob man mehr Wert auf Geschwindigkeit oder mehr Wert auf Speicherplatzverbrauch legt
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

BlackJack hat geschrieben:Effektiv hat mit Geschwindigkeit nix zu tun. Effektiv ist etwas, wenn es den gewünschten Effekt hat, und das haben beide Varianten. Du verwechselst das wahrscheinlich gerade mit effizient. Da kommt's dann in der Tat darauf an, ob man mehr Wert auf Geschwindigkeit oder mehr Wert auf Speicherplatzverbrauch legt
Effektivität hat auch was mit Geschwindigkeit zu tun. Wenn du zum Beispiel nur 5sec Zeit hast, den String zu ermitteln, dann kann das mit bz2 schon mal hackelig werden, denn du ermittelst in den meisten Fällen weniger von der Gestamten Information, als du ohne bz2 ermitteln würdest. Die Daten zu komprimieren, wäre also weniger effektiv, als es zu lassen.

Effektivität ist ein sehr relativer Begriff.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

ProgChild hat geschrieben:Effektivität ist ein sehr relativer Begriff.
Nach der Lektür der Wikipedia-Artikel zu Effektivität und Effizienz würde ich BlackJack spontan recht geben. In dem Fall haben wir aber alle Zeit der Welt, nicht nur 5 Sekunden, deswegen sind beide Varianten genauso Effektiv. BlackJacks Variante ist halt effizienter was die Zeit betrifft, Joghurts Variante ist effizienter was den Speicherbedarf angeht.

Wenn wir null Nanosekunden Zeit hätten, dann wären beide Varianten uneffektiv, aber es ging hier ja nie um Zeit sondern nur um Hashwert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Alle md5sum Code-Snippets, die mir bislang über den Weg gelaufen sind, hatten eine Variable "bufsize". Eine Datei wird immer schrittweise (Schrittweite ist "bufsize" in Bytes) eingelesen und der md5-Wert wird zum vorherigen quasi "drauf-addiert".

Warum macht man das schrittweise und nicht mit einem Mal? Was kann bei großen Dateien passieren? Wie hoch sollte man den Puffer wählen?
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Bei großen Dateien berechnet er die md5-Summe genauso, außer dass es durchaus passieren kann dass die Datei im schlimmsten Fall nicht in Deinen Speicher passt oder (im weniger schlimmen Fall) der Rechner anfängt zu swappen. Denk dran dass Du zum Beispiel eine md5-Summe eines DVD-isos berechnen willst, und ich bin mir sicher, dass mein Computer die Datei nicht im Speicher inkl. Swap halten kann.

Sonst, bufsize darfst Du im Prinzip so groß wählen wie Du willst; wenn Du die Datei auf einmal liest ist da ja nix anderes als wenn Du bufsize=<Dateigröße> setzen würdest. Immer mit dem Hinweis auf Speicher-/Laufzeit-Effizienz (also je größer bufsize desto schneller die Berechnung bis swap-grenze erreicht denn dann wieder viel viel langsamer; je kleiner bufsize desto sparsamer bei der Speichernutzung).

--- Heiko.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ach, und wie ich das verstehe, ist die resultierende MD5 nicht von der bufsize Größe abhängig... Es kommt immer die selbe raus... IMHO

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Ach, und wie ich das verstehe, ist die resultierende MD5 nicht von der bufsize Größe abhängig... Es kommt immer die selbe raus... IMHO
Das wäre besser so wenn die Python MD5-Implementierung korrekt ist, ja. ;-)

--- Heiko.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Na klar, die md5 Summe sollte auch immer gleich sein :-)

Also gibt es keine "Regel", wie groß man den Puffer wählen sollte. Letztlich wird sowieso Schritt für Schritt die gesamte Datei eingelesen.

Gibt es noch andere sichere Methoden, um festzustellen, ob sich eine Datei verändert hat (außer Datum und Dateigröße)?

Das Auffinden von Dateien mittels eines Hash-Wertes ist übrigens in den USA patentrechtlich geschützt... dass man sowas schützen kann :-(
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Gibt es noch andere sichere Methoden, um festzustellen, ob sich eine Datei verändert hat (außer Datum und Dateigröße)?
Im Prinzip nicht wirklich, denn die einzige Möglichkeit wirklich zu prüfen ob sich eine Datei geändert hat wäre mittels eines Change-Notifiers vom Betriebssystem (ala fam, dnotify).

Aber selbst eine MD5-Summe ist keine Garantie dafür dass sich in einer Datei nichts verändert hat: da ein vielfach größeres Objekt auf den Bereich 0...2**128-1 abgebildet wird muß es zwangsläufig Kollisionen geben.

Dass MD5 (aus der Gruppe der brauchbaren Einwegfunktionen) so aufgebaut ist dass diese Kollisionen eben wenig wahrscheinlich sind ist klar, man kann sich also guten gewissens drauf verlassen dass die Datei gleichgeblieben ist wenn die MD5-Summe gleich geblieben ist. Aber eben nicht 100%-ig. ;-)

--- Heiko.
Zuletzt geändert von modelnine am Dienstag 17. Januar 2006, 11:06, insgesamt 2-mal geändert.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ja habe mich wegen md5 Kollisionen belesen. Also die Wahrscheinlichkeit einer Kollision ist echt so gering, dass man sich schon auf eine md5 Summe verlassen kann.

Unter dem Sicherheitsaspekt wäre md5 mittlerweile zu überdenken, da der Typ, der bereits md4 geknackt hat, gerade dabei ist, dasselbe für md5 zu machen... aber es ist wohl auf jeden Fall schonmal schwieriger :wink:

--

Was war das mit dem Change-Notifier? Klingt auch interessant, weil eine md5 Summe echt ewig dauern kann, wenn man ein ganzes Verzeichnis oder Laufwerk auf Änderungen prüfen will. War das nur ein Ansatz oder könnte man tatsächlich mit Python diese Change-Notifier auslesen... ist ja sicher vom Betriebssystem abhängig -> Vorteile/Nachteile?
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Zumindest unter Linux kenn ich:

http://pyinotify.sourceforge.net/ (ab Kernel >= 2.6.13, inotify)

und für Linux und SGI:

http://python-fam.sourceforge.net/ (mit installiertem famd und vorzugsweise auch dnotify)

Was Du im Prinzip bekommst ist dass Dein Programm ein Callback registrieren kann wenn bestimmte Operationen im Dateisystem passieren. Das kann zum Beispiel sein dass eine Datei zum Schreiben geöffnet wird, ein Verzeichnis sich geändert hat, etc.

Du wirst dann mittels eines callbacks davon benachrichtigt, dass diese Veränderung passiert ist, und kannst dann eingreifen.

Unter Windows gibt es im Win32-API etwas ähnliches, frag mich jedoch nicht wie man das anspricht (was ja mittels ctypes und pywin32 eigentlich nie ein Problem ist) oder ob es dafür auch einen Pythonischen Wrapper gibt.

--- Heiko.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Wie ist MD5 in Python implementiert? Ich finde kein Python-Modul im Verzeichnis "Lib" (Windows). Und auch nicht in einem anderen Unterverzeichnis, da liegen höchstens ein paar Tests und Beispiele zur Anwendung.

Ist der MD5-Algorithmus direkt "fest eingebaut", also evtl. sogar als C-Programm?

Habe gestern rekursiv mein komplettes Laufwerk "C:" durchlaufen lassen und dabei für jede einzelne Datei einen MD5-Hash erstellen lassen. Nach 17 Minuten war Python fertig. Es handelte sich um über 10,3 GB und einige 50.000 Dateien.

Ist das nun schnell oder langsam :D ???
Antworten