Gibt es eine Effizienzanalyse, wie MD5 von der Dateigröße abhängt. Ist es tatsächlich abhängig von der Dateigröße oder dem Inhalt der Datei? Also, weil ich 500mb Datei mit allen Leerzeichen und eine 500mb Datei mit Film drin habe, würde MD5 die gleiche Zeit nehmen, um den Hash-Code zu generieren?Wie hängt die MD5-Generierung von der Dateigröße ab?
Antwort
Jedes Hashsum ist per Definition eine mathematische Summe der Bytes von dem, was Sie summieren. Sie müssen die Datei zumindest über einen Stream lesen - es dauert länger, bis mehrere Bytes durchlaufen werden. Allerdings würde ich (allgemein gesprochen) sagen, der Engpass ist in der Tat lesen die Datei, egal was Sie damit versuchen - nicht Hashing, sobald Sie es gelesen haben.
Edit: Ich habe die Frage ein bisschen falsch gelesen. Es dauert genau die gleiche Zeit, um zwei Dateien gleicher Größe zu hashen. 500mb Räume sind 500mb Bytes, die "Raum" darstellen. Das sind immer noch 8 Datenbits pro Byte, genau wie jede andere Datei.
Alle Hashes im Allgemeinen und einschließlich MD5 haben keine Leistung abhängig vom Inhalt.
Da MD5 meist von XOR besteht, AND, OR und NOT-Operationen, die Geschwindigkeit ist nicht abhängig von einem bestimmten Bit eine 1 oder eine 0.
Von http://en.wikipedia.org/wiki/MD5 enthält:
Es gibt vier mögliche Funktionen F; ein anderes wird in jeder Runde verwendet:
Hier ist ein kurzer empirischer Test.
# dd if=/dev/urandom of=randomfile bs=1024 count=512000
# dd if=/dev/zero of=zerofile bs=1024 count=512000
# time md5 randomfile
MD5 (randomfile) = bb318fa1561b17e30d03b12e803262e4
real 0m2.753s
user 0m1.567s
sys 0m1.157s
# time md5 zerofile
MD5 (zerofile) = d8b61b2c0025919d5321461045c8226f
real 0m2.761s
user 0m1.567s
sys 0m1.168s
Dies wird gemäß früheren Antworten unter Anspielung auf die im MD5-Algorithmus verwendeten Bitmanipulationen erwartet.
MD5 arbeitet wie die meisten anderen Hash-Algorithmen mit Blöcken. Für jeden 512-Bit-Block des Eingangs führt er dieselbe Operation aus und verwendet den Ausgang als Teil der Eingabe für den nächsten Block.
Die Operation besteht aus den gleichen grundlegenden Operationen (XOR, AND, NOT etc.). Auf allen Prozessoren, die ich kenne, werden diese Operationen die gleiche Zeit dauern, egal was die Argumente sind. Daher sollte die Zeit, die MD5 zur Verarbeitung der Eingabe benötigt, linear in der Anzahl der 512-Bit-Blöcke in der Eingabe sein.
Wie wäre es möglich, dass ein Computer ein kurzes Byte-Array in genau der gleichen Zeit wie ein langes Byte-Array durchläuft? –
Äh, ich sehe was du jetzt sagst. Ein Byte ist ein Leerzeichen, das andere Byte ist nicht - gleiche Größe, anderer Inhalt. Nevermind :) –