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 ;-/
Hashwert einer Datei ermitteln?!
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi!Anonymous hat geschrieben:mir ist nur wichtig eine zeichenkette zu erhalten, die eine datei genau identifiziert
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- 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
Streng genommen liefert der folgende Schnipsel eine Zeichenkette, welche die Datei genau identifiziert: 

Code: Alles auswählen
fileobj = open('dateiname', 'rb')
id_str = fileobj.read()
fileobj.close()
Das ist aber uneffektiv! Viel besser ist:
Code: Alles auswählen
id_str = bz2.compress(fileobj.read())

Ich weis nicht. Kommt auf die definition von effektiv an. Wenns um Geschwindigkeit geht, dann ist das alles andere, als effektiv.Joghurt hat geschrieben:Das ist aber uneffektiv! Viel besser ist:Code: Alles auswählen
id_str = bz2.compress(fileobj.read())
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 legtProgChild hat geschrieben:Ich weis nicht. Kommt auf die definition von effektiv an. Wenns um Geschwindigkeit geht, dann ist das alles andere, als effektiv.Joghurt hat geschrieben:Das ist aber uneffektiv! Viel besser ist:Code: Alles auswählen
id_str = bz2.compress(fileobj.read())
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.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 ist ein sehr relativer Begriff.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.ProgChild hat geschrieben:Effektivität ist ein sehr relativer Begriff.
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
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?
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?
-
- 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.
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.
-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
Das wäre besser so wenn die Python MD5-Implementierung korrekt ist, ja.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

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

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

-
- User
- Beiträge: 670
- Registriert: Sonntag 15. Januar 2006, 18:42
- Wohnort: Celle
- Kontaktdaten:
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).Gibt es noch andere sichere Methoden, um festzustellen, ob sich eine Datei verändert hat (außer Datum und Dateigröße)?
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.
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
--
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?
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

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