Probleme mit Datei-Hash Berechnung
Übersicht

danibertBetreff: Probleme mit Datei-Hash Berechnung |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich möchte Hashwerte für Dateien berechnen. Zur Berechnung habe ich das Beispiel von http://www.blitzbasic.com/code...?code=1449 verwendet, was auch recht gut funktioniert. Den Code habe ich in der Datei hashAlgos.bmx gespeichert und binde ihn wie folgt ein: Code: [AUSKLAPPEN] Import maxgui.drivers
Strict Include "hashAlgos.bmx" ' Quelle: http://www.blitzbasic.com/codearcs/codearcs.php?code=1449 Function md5_File:String(path:String) If FileType(path) = 1 Then Local bytes:Byte[] = New Byte[FileSize(path)] Local s:TStream = ReadStream(path) If s Then s.ReadBytes(bytes, bytes.Length) s.Close() Local str:String = String.FromBytes(bytes, bytes.length) Return MD5(str) End If End If Return "" End Function ' Testdatei Local sourcefile:String = "F:\testfile.avi" Print md5_File(sourcefile) Repeat WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End End Select Forever Nun zum Problem: Wenn die zu verarbeitenden Dateien größer als ca. 300 MB sind, stürzt mein Programm mit der Meldung "Windows Exception: EXCEPTION_ACCESS_VIOLATION" ab. Keine weitere Beschreibung des Fehlers, der Debugger findet auch nichts. Bei kleineren Dateien klappt alles problemlos und die Hashwete werden korrekt berechnet. Wie lässt sich dieses Problem beheben? Hat jemand Erfahrung mit diesem Fehler? Danke im Voraus für alle Tipps |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMax: [AUSKLAPPEN] Local bytes:Byte[] = New Byte[FileSize(path)] Du überlastest einfach deinen PC. Das erste Array braucht für die Datei 300 MB Speicher. Aus diesem Array erstellst du aber noch einen String mit der selben Länge. (+600 MB) Das macht 900 MB an Speicher, welchen du innerhalb von wenigen Befehlen anforderst. Das kann einfach nicht gut gehen, wenn du nicht gerade einen Superrechner hast. Wandle die Hashfunktion am Besten so um, dass sie Streams ausliest und maximal ca. 1 KiB auf einmal bearbeitet. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am Do, Mai 06, 2010 18:32, insgesamt einmal bearbeitet
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@mpmxyz
Ich habe momentan knapp 7 GB verfügbaren RAM (XP 64 Bit) Was mich an der Sache wundert, zum Überprüfen der berechneten Hashwerte benutze ich ein Tool namens Hashcalc. Dieses berechnet mir auf dem selben Rechner problemlos Hashwerte von 4 GB großen Files (noch dazu in extremer Geschwindigkeit, nichts mit auslagern etc.). Wie kann das funktionieren? Leider habe ich keinen Quelltext von Hashcalc ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm... Das ist schon seltsam.
Bestimme die Quelle des Fehlers am Besten mit "DebugLog" und "DebugStop". Vielleicht löst sich das Rätsel dann. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
...ich versuche gerade, das Ganze wie angesprochen umzubauen, dass nur wenige KB auf einmal bearbeitet werden. Mir fehlt aber irgendwie der Ansatz, wie ich die Datei anders in die Hashfunktion bringen soll.
Zudem überlege ich, eine Progressbar zur Anzeige des Fortschritts einzubauen, was die Sache noch erschwert. Wie bekomme ich aus der Hashberechnung einen Event, der die Progressbar steuert? Ich glaube, da braucht es noch viel üben.... |
||
FWeinbehemals "ich" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vor langer Zeit mal im BB.com Forum gefunden.
BlitzMax: [AUSKLAPPEN] Function MD5:String(in:String) Hoffe das Hilft dir. MfG ich |
||
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs |
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
...Neuer Versuch, gleiches Ergebnis ![]() Folgendes habe ich Probiert: Da ich nicht unbedingt den Hashwert für die gesamte Datei (am Stück) brauche, versuche ich also, die Datei in kleineren Paketen zu lesen und für jedes Paket einen Hash zu errechnen. Im Beispiel sind es 50MB, es funktioniert aber auch mit anderen Paketgrößen nicht. Das Problem kommt auch nicht von der Hashfunktion selbst, wenn ich diese komplett weglasse, habe ich das selbe Problem. Code: [AUSKLAPPEN] Import maxgui.drivers
Strict Include "hashAlgos.bmx" ' Quelle: http://www.blitzbasic.com/codearcs/codearcs.php?code=1449 Function makeHashes:String(path:String) If FileType(path) = 1 Then ' Startvariablen festlegen Local bytesGesamt:Int = Int(FileSize(path) ) Local packageSize:Int = 52428800 ' Größe der Hashpakete in Byte Local currentByte:Int = 0 Local str:String Local i ' Anzahl der Datenpakete errechnen Local rounds2Hash:Int = Floor(bytesGesamt / packageSize) Local rest2hash:Int = bytesGesamt - (rounds2Hash * packageSize) ' Datei öffnen Local bytes:Byte[] = New Byte[FileSize(path)] Local s:TStream = ReadFile(path) ' Datenpakete aus Datei lesen und Hash berechnen If s Then For i=1 To rounds2Hash s.Seek(currentByte) s.ReadBytes(bytes, packageSize) str = String.FromBytes(bytes, bytes.length) Print MD5(str) currentByte = packageSize * i Print "weiter..." Next ' Restliche Bytes auslesen und Hash berechnen If (bytesGesamt-currentByte) > 0 Then s.Seek(currentByte) s.ReadBytes(bytes, (bytesGesamt-currentByte)) str = String.FromBytes(bytes, (bytesGesamt-currentByte)) Print MD5(str) EndIf ' Datei schließen s.Close() End If End If Return "" End Function ' Testdatei Local sourcefile:String = "J:\Testfile_500mb.test" Local hashResult:String = makeHashes(sourcefile) End Ich kann den Fehler einfach nicht finden.... Hat jemand eine Idee, wie das funktionieren könnte? |
||
danibert |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
![]() ![]() Ich hatte komplett übersehen, dass ich mit str = String.FromBytes(bytes, bytes.length) ja doch wieder die gesamte Datei in die Variable drücke. Naja, aller Anfang ist schwer. Danke nochmal für alle Tipps. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group