Seite 1 von 2

Hashwert einer Datei ermitteln?!

Verfasst: Donnerstag 5. Januar 2006, 13:52
von 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 ;-/

Verfasst: Donnerstag 5. Januar 2006, 13:52
von Gast
ich bins nochmal^^
das ganze sollte in python geschrieben sein^^

Re: Hashwert einer Datei ermitteln?!

Verfasst: Donnerstag 5. Januar 2006, 15:49
von gerold
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
:-)

Verfasst: Donnerstag 5. Januar 2006, 16:47
von jens
Wenn es auch eine MD5 Checksum sein kann, dann schau mal hier: http://www.jensdiemer.de/Programmieren/ ... ets/md5sum

Re: Hashwert einer Datei ermitteln?!

Verfasst: Donnerstag 5. Januar 2006, 17:17
von Joghurt
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 ;)

Verfasst: Donnerstag 5. Januar 2006, 22:50
von 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()

Verfasst: Freitag 13. Januar 2006, 16:48
von Joghurt
Das ist aber uneffektiv! Viel besser ist:

Code: Alles auswählen

id_str = bz2.compress(fileobj.read())
:-P

Verfasst: Freitag 13. Januar 2006, 17:39
von ProgChild
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.

Verfasst: Freitag 13. Januar 2006, 23:42
von 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

Verfasst: Samstag 14. Januar 2006, 10:27
von ProgChild
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.

Verfasst: Samstag 14. Januar 2006, 18:26
von Leonidas
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.

md5 und bufsize

Verfasst: Dienstag 17. Januar 2006, 00:20
von droptix
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?

Verfasst: Dienstag 17. Januar 2006, 01:34
von modelnine
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.

Verfasst: Dienstag 17. Januar 2006, 07:35
von jens
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

Verfasst: Dienstag 17. Januar 2006, 10:45
von modelnine
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.

md5 sollte auch immer dieselbe sein

Verfasst: Dienstag 17. Januar 2006, 10:45
von droptix
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 :-(

Verfasst: Dienstag 17. Januar 2006, 10:52
von modelnine
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.

md5 Kollisionen

Verfasst: Dienstag 17. Januar 2006, 11:00
von droptix
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?

Verfasst: Dienstag 17. Januar 2006, 11:06
von modelnine
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.

Wie ist MD5 in Python implementiert?

Verfasst: Mittwoch 18. Januar 2006, 11:12
von droptix
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 ???