Christoph.K said:
Die Frage lautet, welche Art von und Menge an Daten du auf welche Weise identifizieren möchtest.
Allerdings. Denn oftmals benötigt man gar keine kompletten Hashes.
Wenn man hashes in eine permanente Datenbank schreiben will, also Daten hat, die einmal archiviert werden und dann nur noch (per hash) drauf zugegriffen wird, ok, dann sollte man alles hashen.
Aber wenn es z.B. um sich ständig ändernde Daten geht, die bei jedem Lauf neu verglichen werden, kann es sich u.U. lohnen anders vorzugehen. Beispiel rsync:
Sind die Dateigrößen verschieden -> Dateien unterschiedlich
Sind sie gleich -> weiter mit nächstem Punkt.
Sind die schwachen hashes ersten paar Bytes verschieden -> Dateien sind unterschiedlich
Sind sie gleich -> stärkere hashes bzw. bit-für-bit-Vergleich anwenden
... weiter mit den nächsten bytes... usw.
(rsync hat da noch andere Feinheiten, z.B. nur geänderte Blöcke zu übertragen, aber darum geht es ja hier nicht!?)
Und bei der Wahl des Hashes an sich kommt es auch darauf an, was man damit erreichen will. Will man (böswillige) Veränderungen verhindern, dann reicht im ersten Schritt md5 u.U. schon nicht mehr und man braucht stärkere Verfahren. Um nur Unterschiede zu finden, kann man allerdings auch getrost schon auf schwächeres zurückgreifen. Günstiger berechenbar sind als Beispiel CRC-Checksummen, die für diesen Zweck u.U. ebenfalls geeignet sind. (Besonders in Hardware lassen sich diese AFAIK wesentlich einfacher realisieren als mdX oder shaX, da ein einfaches Schieberegister reicht. Aber sie bieten KEINE Sicherheit gegen absichtliche Manipulationen und bei vielen verschiedenen Datensätzen ist die Gefahr von Kollisionen deutlich höher!)
-- Mo Jul 25, 2011 12:03 --
Kannte ich selber noch nicht, aber ein wirklich schneller und einfacher Algorithmus ist z.B. Adler-32 (
http://de.wikipedia.org/wiki/Adler-32)
Zum Vergleich auf Unterschiedlichkeit hervorragend geeignet: Sind zwei Adler-32-Werte verschieden, sind die Daten verschieden.
Sind die Adler-32-Werte aber gleich, besteht eine höhere Wahrscheinlichkeit als bei crc32 oder gar md5, dass die kompletten Daten dennoch verschieden sind. Dennoch kann das - je nach Anwendungsfall - durchaus ausreichend sein!