Computing Hash beim Speichern einer Datei?

8

Ich habe eine inputStream , die ich verwenden möchte, um einen Hash zu berechnen und die Datei auf der Festplatte zu speichern. Ich würde gerne wissen, wie man das effizient macht. Sollte ich eine Aufgabe gleichzeitig ausführen, sollte ich den Stream an zwei Streams weitergeben, einen für die Methode saveFile und einen für die Methode computeHash , oder sollte ich etwas anderes tun?

    
Dave 20.06.2012, 17:41
quelle

5 Antworten

3

Wie wäre es mit einem Hash-Algorithmus, der auf Blockebene arbeitet? Sie können den Block zu dem Hash hinzufügen (mit dem TransformBlock) und anschließend den Block des in der Stream-Datei foreach Block schreiben.

ungetestete grobe Aufnahme:

%Vor%     
Matt Murrell 20.06.2012 18:41
quelle
2

Diese Methode wird mit verketteten Streams kopieren und hashen.

%Vor%

Vollständige Probe siehe Ссылка

    
dh_cgn 14.06.2017 14:55
quelle
1

Es ist vielleicht nicht die beste Option, aber ich würde mich für Stream descendant / wrapper entscheiden, dasjenige, das für einen Durchlauf der Datei auf die Festplatte übergeben wird.

Also:

  • stammt von Stream
  • hat ein Mitglied wie Stream _inner; , das der Zielstream zum Schreiben ist
  • implementieren Write() und alle verwandten Sachen
  • in Write() hash die Datenblöcke und Aufruf _inner.Write()

Anwendungsbeispiel

%Vor%     
Daniel Mošmondor 20.06.2012 21:28
quelle
0

Sie müssen die Bytes des Streams in ein byte[] füllen, um sie zu hashen.

    
bluevector 20.06.2012 18:17
quelle
0

Hier ist meine Lösung, es schreibt ein Array von Strukturen (die Variable ticks) als csv-Datei (mit dem CsvHelper nuget-Paket) und erstellt dann einen Hash für Prüfsummenzwecke mit dem Suffix .sha256

Ich tue dies, indem ich den csv in einen memoryStream schreibe, dann den Speicherstrom auf die Festplatte schreibe und den memorystream dann an den Hashalgo übergebe.

Diese Lösung speichert die gesamte Datei als Speicherstream. Es ist in Ordnung für alles außer Multi-Gigabyte-Dateien, die Sie aus dem RAM führen würde. Wenn ich das nochmal machen müsste, würde ich wahrscheinlich versuchen, CryptoStream zu verwenden, aber das ist gut genug für meine vorhersehbaren Zwecke.

Ich habe über ein Drittanbieter-Tool verifiziert, dass die Hashes gültig sind.

Hier ist der Code:

%Vor%     
JasonS 29.09.2015 14:35
quelle

Tags und Links