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?
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% 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:
Stream
Stream _inner;
, das der Zielstream zum Schreiben ist Write()
und alle verwandten Sachen Write()
hash die Datenblöcke und Aufruf _inner.Write()
Anwendungsbeispiel
%Vor% Sie müssen die Bytes des Streams in ein byte[]
füllen, um sie zu hashen.
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%