Was ist der schnellste Hash-Algorithmus, um zu prüfen, ob zwei Dateien gleich sind?
Was ist der Schnellste Weg, um erstellen Sie eine hash-Funktion, die verwendet werden, um zu überprüfen, ob zwei Dateien gleich sind?
Sicherheit ist nicht sehr wichtig.
Edit: ich bin das senden einer Datei über ein Netzwerk-Anschluss, und wird sicher sein, dass die Datei auf beiden Seiten gleich sind
InformationsquelleAutor der Frage eflles | 2009-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Ansatz sein könnte, um eine einfache CRC-32-Algorithmus, und nur, wenn die CRC-Werte gleich sind, führen Sie erneut den Hashwert mit SHA1 oder etwas robuster. Eine schnelle CRC-32 zu übertreffen eine kryptografisch sichere hash-jeden Tag.
InformationsquelleAutor der Antwort Greg Hewgill
Es sei denn, Sie verwenden eine sehr komplizierte und/oder langsam-hash, wird das laden der Daten von der Festplatte dauert viel länger als das berechnen der hash (es sei denn, Sie verwenden Sie RAM-disks oder top-end-SSDs).
So zum vergleichen von zwei Dateien, die Verwendung dieses Algorithmus:
Diese ermöglicht ein schnelles scheitern (wenn die Größen unterschiedlich sind, Sie wissen, dass die Dateien unterschiedlich sind).
Dinge selbst zu machen und schneller, können Sie berechnen den hash einmal und speichern Sie Sie zusammen mit der Datei. Auch speichern der Datei, Datum und Größe in dieser extra-Datei, so wissen Sie schnell, wenn Sie berechnen den hash oder löschen Sie die hash-Datei, wenn die Haupt-Datei ändert.
InformationsquelleAutor der Antwort Aaron Digulla
xxhash vorgibt sich als ziemlich schnell und stark, Kollision-Weise:
http://cyan4973.github.io/xxHash/
Gibt es eine 64-bit-Variante, die läuft "noch schneller" auf 64-bit-Prozessoren als die 32, insgesamt.
http://code.google.com/p/crcutil wird auch gesagt, ganz schnell (und nutzt die hardware-CRC-Anweisungen, wo vorhanden, die sind wohl sehr schnell, aber wenn Sie nicht über hardware verfügen, die Sie unterstützt, nicht so schnell). Weiß nicht, ob CRC32c ist so gut eine hash (in Bezug auf Kollisionen) als xxHash oder nicht...
https://code.google.com/p/cityhash/ scheint ähnliche und Verwandte zu crcutil [in, dass es kompilieren können, nach unten zu verwenden, hardware CRC32c Anweisungen, wenn es vorgeschrieben ist].
Wenn Sie "wollen einfach nur die schnellsten raw speed" und don ' T care so viel über die Qualität der zufälligen Verteilung der hash-Ausgang (zum Beispiel mit kleinen Mengen, oder wo die Geschwindigkeit ist von größter Bedeutung), gibt es einige schnelle algorithmen, die hier erwähnt werden: http://www.sanmayce.com/Fastest_Hash/ (diese "nicht ganz zufällig" Verteilungs-Typ-algorithmen sind, in einigen Fällen "gut genug" ist, und sehr schnell). Offenbar
FNV1A_Jesteress
ist der Schnellste für die "langen" Zeichenfolgen, einige andere möglicherweise für kleine Zeichenfolgen. http://locklessinc.com/articles/fast_hash/ scheint auch verwandt. Ich habe nicht die Forschung, um zu sehen, was die Kollision Eigenschaften dieser sind.InformationsquelleAutor der Antwort rogerdpack
Könnten Sie versuchen,MurmurHashdie speziell entwickelt wurde, um schnell und ist ziemlich einfach zu Programmieren. Möchten Sie vielleicht ein zweiter, sicherer hash-wenn MurmurHash returns-ein Spiel obwohl, nur um sicher zu sein.
InformationsquelleAutor der Antwort int3
Für diese Art von Anwendung, Adler32 ist wahrscheinlich der Schnellste Algorithmus, mit einem vernünftigen Maß an Sicherheit. Für größere Dateien können Sie berechnen, mehrere hash-Werte, zum Beispiel eine pro block von 5 Mb der Datei, also eine Verringerung der Chancen von Fehlern (D. H. in Fällen, wenn die hashes sind gleich, doch der Inhalt der Datei unterscheiden). Außerdem finden Sie in diesem multi-hash-Werte-setup kann die Berechnung der hash-Implementierung in ein multi-thread Mode.
Bearbeiten: (Nach Steven Sudit ' s Bemerkung)
Ein Wort der Vorsicht, wenn die Dateien klein sind!
Adler32 die "cryptographic" Eigenschaften, oder vielmehr seine Schwächen sind bekannt vor allem für kurze Nachrichten. Aus diesem Grund ist die vorgeschlagene Lösung sollte vermieden werden, für Dateien, die kleiner sind als ein paar Kilobyte.
Nie weniger, in der Frage der OP explizit sucht ein schneller Algorithmus und verzichtet auf die Bedenken hinsichtlich der Sicherheit. Darüber hinaus die Suche nach Geschwindigkeit kann plausibel unterstellen, dass ist der Umgang mit "großen" Dateien eher als kleine. In diesem Zusammenhang, Adler32, möglicherweise parallel angewendet für Dateien, die Brocken von sagen wir 5 MB bleibt es eine sehr gültige Antwort. Alder32 ist bekannt für seine Einfachheit und Geschwindigkeit. Auch seine Zuverlässigkeit, während die übrigen niedriger als die von CRCs, die die gleiche Länge, ist durchaus akzeptabel für Nachrichten, die über 4000 bytes.
InformationsquelleAutor der Antwort mjv
Wenn es nur ein einmaliger dann gegeben, dass Sie haben zu Lesen, sowohl Dateien, die zum generieren einer hash von beiden, warum nicht Lesen Sie einfach durch eine kleine Menge von jeder an eine Zeit und vergleichen?
Andernfalls CRC ist ein sehr einfacher Algorithmus.
InformationsquelleAutor der Antwort Jeff Foster
Warum willst du hash?
Wenn Sie sicherstellen möchten, dass zwei Dateien gleich sind, dann ist per definition haben Sie, um die gesamte Datei zu Lesen (es sei denn, Sie werden buchstäblich die gleiche Datei, in dem Fall kann man sagen, durch die Suche in meta-Daten auf dem Datei-system). Jedenfalls kein Grund, um hash-Werte, die nur Lesen und sehen, ob Sie identisch sind. Hashing wird es weniger effizient. Und auch wenn die hashes übereinstimmen, Sie sind immer noch nicht sicher, ob die Dateien wirklich gleich sind.
Edit: Diese Antwort wurde geschrieben, bevor die Frage angegeben, etwas über ein Netzwerk. Es wird einfach darum gebeten, über den Vergleich von zwei Dateien. Nun, ich weiß, es ist ein Netzwerk hop zwischen den Dateien, würde ich sagen, verwenden Sie einfach einen MD5-hash und mit ihm getan werden.
InformationsquelleAutor der Antwort tster
Was wir optimieren hier ist die verbrachte Zeit auf eine Aufgabe.
Leider wissen wir nicht genug über die Aufgabe zu wissen, was die optimale Lösung sein sollte.
Ist es für ein-Zeit-Vergleich von 2 beliebigen Dateien?
Dann vergleichen Sie die Größe, und nach, vergleichen Sie einfach die Dateien, byte-by-byte (mb oder mb), wenn das ist besser für Ihre IO.
Wenn es für 2 große Gruppen von Dateien, oder viele Sätze von Dateien, und es ist nicht eine einmalige übung. aber etwas, das passiert Häufig, dann sollte man das speichern von hashes für jede Datei. Ein hash ist nie eindeutig, sondern ein hash mit einer Zahl, sagen wir 9 stellen (mit 32 bits) wäre gut für über 4 Milliarden Kombination, und eine 64-bit Zahl wäre gut genug, um zu unterscheiden zwischen etwa 16 * 10^18 Trillionen verschiedene Dateien.
Einen anständigen Kompromiss wäre zum generieren 2 32-bit-hashes für jede Datei, die man für die ersten 8k, eine für 1MB+8k, Schlag Sie zusammen als eine einzelne 64-bit-Zahl. Katalogisieren Sie alle vorhandenen Dateien in eine DB sein sollte, ziemlich schnell und sucht sich ein Kandidat Datei mit dieser DB sollte auch sehr schnell sein. Sobald eine übereinstimmung vorhanden ist, der einzige Weg, um festzustellen, ob Sie identisch sind, ist zu vergleichen mit den ganzen Dateien.
Ich bin ein Gläubiger in den Menschen, was Sie brauchen, was nicht immer nie, was Sie denken, Sie brauchen, oder was die wollen.
InformationsquelleAutor der Antwort bjorn
In jedem Fall sollten Sie Lesen jede Datei voll (ausgenommen den Fall, wenn Größen-mismatch), so Lesen Sie einfach beide Datei-und-vergleichen-block-zu-block.
Verwenden von hash-nur gewinnen CPU-Auslastung und nichts mehr. Wie Sie schreiben nichts, cache des OS wird wirksam DROP Daten, die Sie Lesen, ja, unter Linux, nur mit cmp tool
InformationsquelleAutor der Antwort socketpair
Der folgende code ist der code um doppelte Dateien zu finden aus meinem persönlichen Projekt zu Sortieren Bilder, die auch entfernt die Duplikate. Nach meiner Erfahrung, zuerst mit schnell hashing algo wie CRC32 und dann tut MD5-oder SHA1-war sogar noch langsamer und hat nicht gemacht, auch keine Verbesserung, da die meisten von den Dateien mit gleichen Größen waren in der Tat doppelt so ausgeführt hashing zweimal wurde teurer von cpu-Zeit-Perspektive, dieser Ansatz kann nicht richtig sein für alle Art von Projekten, aber es ist definitiv wahr für image-Dateien. Hier bin ich tun, MD5-oder SHA1-Hash nur auf die Dateien mit derselben Größe.
PS: Es hängt davon ab, Apache commons codec zum generieren von hash-effizient.
Beispiel für die Nutzung: neue DuplicateFileFinder("MD5").findDuplicateFilesList(filesList);
InformationsquelleAutor der Antwort Hemant
könnten Sie Auschecken der Algorithmus, dass die samba/rsync-Entwickler verwenden. Ich habe nicht sah es in die Tiefe, aber ich sehe es erwähnt, die ganze Zeit. offenbar, es ist ziemlich gut.
InformationsquelleAutor der Antwort clarson