Barthuzus Geschrieben 3. März 2009 Geschrieben 3. März 2009 Soo meine Freunde... Hallo erstmal! Ich habe folgendes Anliegen: Ich sitze gerade an einem Projekt, dass mp3-Dateien aus 2 Verzeichnissen vergleichen soll und sie in einem zusammenfasst (keine Datei soll doppelt vorhanden sein) Da man sich hierbei nicht immer nur auf den Dateinamen und/oder die ID-Tags verlassen kann, möchte ich die Dateien Bitweise vergleichen. Natürlich muss ich dafür die ID-Tags und weitere Informationen aussenvorlassen und nur die eigentlichen Track vergleichen. Jetzt habe ich 2 Fragen: 1. Wie vergleiche ich Dateien bitweise ? und 2. Welche Indentifakoren hab ich, um alle nebensächlichen Informationen bei diesem Vergleich auszugrenzen? PS: Ich weiss dass das bei vielen Dateien sehr lange dauern kann, bis der Vergleich abgeschlossen ist aber ich hab mir die Aufgabe nicht ausgesucht Hoffe Ihr könnt mir helfen... LG Barthuzus edit: das ganze bitte in c# Zitieren
TDM Geschrieben 3. März 2009 Geschrieben 3. März 2009 1. Wie vergleiche ich Dateien bitweise ? MD5-Hash 2. Welche Indentifakoren hab ich, um alle nebensächlichen Informationen bei diesem Vergleich auszugrenzen? Theoretisch gar keine, da Informationen meist auch mit in der Datei (bitweise) stehen. edit: das ganze bitte in c# Codesnips - MD5 Hash einer Datei mit C# Zitieren
Barthuzus Geschrieben 3. März 2009 Autor Geschrieben 3. März 2009 Vielen Dank schonmal, ich hab das Codesnippet mal ausprobiert aber da ist wohl ein Fehler drin, dass ich einen Fehler beim übertragen gemacht habe schliesse ich einfach mal aus Fehler 1 Eine implizite Konvertierung vom Typ "System.Security.Cryptography.MD5CryptoServiceProvider" in "string" ist nicht möglich. und das beim return return md5; Wenn ich es im Grunde vergessen kann nebensächliche Infos auszugrenzen, dann scheiter ich ja theoretisch schon an unterschiedlichen Dateinamen, oder? Zitieren
Argbeil Geschrieben 3. März 2009 Geschrieben 3. März 2009 Ich würde die Dateien nicht per Hash vergleichen. Es könnte sein das sich die Dateien nur im ID3-Tag unterscheiden, sowas kannst du damit nicht feststellen, bei dem Hash wird es nur ein GLEICH oder NICHT GLEICH geben. Zitieren
VaNaTiC Geschrieben 3. März 2009 Geschrieben 3. März 2009 Falsch ein Hash ist kein eindeutiger Vergleich auf die Orginaldaten!!! Bitte aufpassen, nur weil man in der Computertechnik Hashing benutzt um Keys oder IDs herzustellen, heisst das nicht, dass die nicht doppelt vorkommen könnten bei unterschiedlichen Eingangsdaten. Die Wahrscheinlichkeit ist nur sehr sehr gering! Ein Hash ist grob gesagt nix weiter als eine bessere Quersumme! Bitweises vergleichen ist außerdem meiner Meinung nach absolut nicht notwendig. Wenn dann liest Du die Datei in einen Puffer oder extrahierst Dir in ein Array/Puffer (je nachdem wie toll Du das machen willst) und vergleichst byteweise oder besser sogar gleich 4 bytes in einem Integer auf einem 32bit System solange es eben 4 Bytes sind und nur den Rest byteweise. Aber das wird nicht lustig, dauert lang und ist glaube auch nicht die Lösung für Deine Aufgabenstellung, denn Du müsstest sozusagen, jede Datei aus Verzeichnis 1 mit jeder Datei aus Verzeichnis 2 vergleichen. Die Vermutung liegt nahe, wie TDM bereits sagte ein Hash-Verfahren zum Vergleichen herangezogen werden soll. Ich würde Dir ein Hashverfahren empfehlen, welches geradeso groß ist, dass es in eine minimale MP3-Datei "passt". Beispiel: minimale MP3-Datei Track 0 Sekunden, keine ID3Tags, ein paar MP3-Header, ...) wären vielleicht 150 Byte. Dann würde ich die Hashgröße auf 128 Byte (1024 bit) festlegen. Zitieren
TDM Geschrieben 3. März 2009 Geschrieben 3. März 2009 Falsch ein Hash ist kein eindeutiger Vergleich auf die Orginaldaten!!! Bitte aufpassen, nur weil man in der Computertechnik Hashing benutzt um Keys oder IDs herzustellen, heisst das nicht, dass die nicht doppelt vorkommen könnten bei unterschiedlichen Eingangsdaten. Die Wahrscheinlichkeit ist nur sehr sehr gering! Ja, Kollisionsangriffe sind zwar möglich, aber eigentlich sollte das nicht der Fall sein, wenn man vergleichen will. Ein Hash ist grob gesagt nix weiter als eine bessere Quersumme! Aber ganz grob... bei einer Quersumme kann man Summanden vertauschen. Mehr ne Art Checksumme und die verwendet man ja für Vergleiche. Bitweises vergleichen ist außerdem meiner Meinung nach absolut nicht notwendig. Wenn dann liest Du die Datei in einen Puffer oder extrahierst Dir in ein Array/Puffer (je nachdem wie toll Du das machen willst) und vergleichst byteweise oder besser sogar gleich 4 bytes in einem Integer auf einem 32bit System solange es eben 4 Bytes sind und nur den Rest byteweise. Interation in 4-Byte-Schritten und jeweils MD5 Hash über die x. 4 Bytes von Datei 1 mit den x. 4 Bytes von Datei 2 vergleichen - ich sehe da kein Problem mit der Kollision - oder hab ich was falsch verstanden? Aber das wird nicht lustig, dauert lang und ist glaube auch nicht die Lösung für Deine Aufgabenstellung, denn Du müsstest sozusagen, jede Datei aus Verzeichnis 1 mit jeder Datei aus Verzeichnis 2 vergleichen. Simples Kreuzprodukt? Beispiel: minimale MP3-Datei Track 0 Sekunden, keine ID3Tags, ein paar MP3-Header, ...) wären vielleicht 150 Byte. Dann würde ich die Hashgröße auf 128 Byte (1024 bit) festlegen. Theorie: Wrapper-Klasse schreiben, welches anhand des Dateiformats gleich entsprechende Informationen als string o.Ä. ausliest und diese dann vergleichen. Aber ich glaub das wäre etwas ... überdimensioniert für so ne Aufgabe. :floet: Memo an mich selbst: Bei Gelegenheit mal ausprobieren. Zitieren
VaNaTiC Geschrieben 3. März 2009 Geschrieben 3. März 2009 Soweit mir bekannt, ist Checksumme (Prüfsumme) ein Anwendungsgebiet der Hashfunktionen. Ja, ich sagte bereits grob wie eine Quersumme Ist schwer einzuschätzen, wie grob. Sollte nur als Gedankenstütze dienen und ich denke das hat es Simples Kreuzprodukt? Hmm, mit quadratisch wachsendem Aufwand? Na toll. 1000x1000x~4MB Dateien, viel Spass, wenn man das wirklich "vergleicht" ohne Hashing Und da er ja eingangs schon erwähnte, dass er den "Vergleich" ohne die ganzen IDx-Tags machen will, musst auch wirklich den Track extrahieren und vergleichen oder hashen. Zitieren
Pointerman Geschrieben 3. März 2009 Geschrieben 3. März 2009 Moin! Den Hash kann man nur verwenden um zu sagen, dass Dateien definitiv nicht gleich sind. Wenn der Hashcode gleich ist, muss man sich trotzdem noch einmal die Muehe machen, die Dateien genauer zu vergleichen, weil unterschiedliche Daten den gleichen Hash haben koennen. Wird ja bei Equals-Methoden auch gerne so gemacht, um den Vergleich zu beschleunigen. Zitieren
Barthuzus Geschrieben 6. März 2009 Autor Geschrieben 6. März 2009 Hallo meine Freunde, Danke erstmal für die vielen Infos Ich werd das ganze mit nem Hash-Vergleich machen und dazu noch Dateigröße + Spiellänge etc für den Vergleich heranziehen. Ich hab mir das jetzt folgendermaßen gedacht: Ich lese alle ID-Tags der MP3s in eine Collection und lösche danach die Tags vollständig aus der Datei um im Anschluss den Hash zu ermitteln und nach Ermittlung des Hashs schreib ich die Tags wieder rein. (so bekomm ich wenigstens wegen den Tags keine Probleme und sie gehen nicht verloren) Jetzt wollte ich mal fragen, ob ihr nen Befehl für die TagLib# kennt, der komplett alle Tags rauslöscht? Ich wills mir ersparen alle einzeln zu löschen In Google hab ich dazu nichts gefunden. LG Barth Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.