Ich möchte einen schnellen Weg finden, um festzustellen, ob eine Datei identisch sein kann oder nicht. Für eine fast 100% ige Sicherheit würde ich einen vorhandenen Hash-Algorithmus verwenden, z. B. SHA256. Es wird jedoch erwartet, dass es sich bei den Dateien um riesige Videodateien mit mehreren GB handelt. Daher kann die Berechnung des SHA256-Hash einige Zeit in Anspruch nehmen, insbesondere über das Netzwerk.
Deshalb möchte ich verschiedene andere Techniken kombinieren:
- Dateigröße: Wenn sich die Dateigröße geändert hat, hat sich der Inhalt geändert (sicher)
- Kopf / Schwanz-Hash
- zufälliger Hash
Die letzteren 2 sind Teil meiner Frage:
Meine Vermutung wäre, dass es in der Kopfzeile Dinge gibt wie:
- Bildraten (zB Videos)
- Auflösung (zB Videos, Bilder)
- (Datei-) Länge (z. B. in Frames, Pixeln usw.)
- Datum der letzten Änderung (z. B. Word-Dokumente, nicht speziell Videos)
Warum ich erwäge, den Schwanz zu überprüfen, ist:
- MP3 hat dort die Tag-Informationen
- EXIF fügt am Ende benutzerdefinierte Daten hinzu, wenn ich recht habe
Zufällige Hashes würden z. B. 126 Regionen an zufälligen Positionen in der Datei mit einer bestimmten Länge auswählen, z. B. 64 kB, und einen Hash für sie erstellen. Natürlich erinnere ich mich an die Offsets für einen späteren Vergleich. Alles in allem würde ich (1 + 126 + 1) * 64 kB Daten für meinen Hash verwenden, daher muss ich nur 8 MB anstelle mehrerer GB lesen, um den Hash zu erhalten.
Vielleicht ist es jetzt eher eine mathematische Frage, aber: Wie wahrscheinlich ist es, dass eine Änderung mithilfe der Kombination aus Dateigröße, Kopf-, End- und Zufallsdaten erkannt wird, um diese schnelle Hash-Summe zu generieren?
Ich gehe davon aus, dass die Dateien immer legale Dateien sind. Es hat keinen Vorteil, einzelne Bytes zu manipulieren. Der Benutzer würde ein normales Videobearbeitungswerkzeug verwenden, um die Dateien zu ändern.
UPDATE : Ich habe diese Antwort von Crypto.StackExchange nicht akzeptiert. Ich bin damit einverstanden, dass mein Vorschlag nicht kryptografisch ist und nicht sicher sein soll. Ich stimme auch zu, dass das CRCing einer Datei schnell ist, aber in meinem Fall brauche ich wirklich einen Hash - ich werde erklären, warum:
- Von meiner Anwendung wird erwartet, dass sie Lesezeichen in Videos speichert. Von meiner Datenbank wird erwartet, dass sie den Video-Hash und die Lesezeichen speichert.
- Benutzer verschieben oder benennen manchmal Dateien um. Mein Programm wird feststellen, dass eine Datei nicht mehr vorhanden ist, die Lesezeichen jedoch nicht aus der Datenbank löschen. Wenn dasselbe Video (versehentlich) erneut abgespielt wird, möchte ich stattdessen erkennen, dass es sich (wahrscheinlich) um dieselbe Datei handelt.
- Von Benutzern wird erwartet, dass sie Dateien auf Netzwerklaufwerken (NAS) speichern und Videos streamen. Das sind dumme Speicher. Ich kann keine Serverkomponente installieren. Und sie könnten ziemlich langsam sein, also möchte ich wirklich nicht den vollen Hash. Die Berechnung eines vollständigen Hashs für eine 3-GB-Datei dauert mindestens 5 Minuten bei 10 MB / s, unabhängig davon, wie schnell der Hashing-Algorithmus ist.
- Wenn der Benutzer die Datei bearbeitet hat, hoffe ich irgendwie, dass der Hash nicht mehr übereinstimmt, da ich sonst falsche Lesezeichen anzeigen würde.
Ich hätte eine Chance von ~ 80% , die richtigen Lesezeichen zu haben. Wie viele Hash-Teile sollte ich zusammenstellen und wo in der Datei wäre das?