Zum Inhalt springen

Dateien Bitweise vergleichen


Barthuzus

Empfohlene Beiträge

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# ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soweit mir bekannt, ist Checksumme (Prüfsumme) ein Anwendungsgebiet der Hashfunktionen.

Ja, ich sagte bereits grob wie eine Quersumme :D Ist schwer einzuschätzen, wie grob. Sollte nur als Gedankenstütze dienen und ich denke das hat es :P

Simples Kreuzprodukt? Hmm, mit quadratisch wachsendem Aufwand? Na toll.

1000x1000x~4MB Dateien, viel Spass, wenn man das wirklich "vergleicht" ohne Hashing :D

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...