Ich habe einen Anwendungsfall, wo ich die Datei von URL herunterladen mit GET-Anfrage. Ist es möglich, SHA256 des Dateistroms zu berechnen, ohne auf Festplatte zu speichern oder ein ganzes Objekt im Speicher zu halten?SHA256 von Datenstrom
2
A
Antwort
2
dies mit einem MessageDigest
und Sink.fold
erreicht werden kann.
Zuerst müssen wir eine Funktion eine leere verdauen und eine Funktion zum Erstellen einer Übersicht aktualisieren mit einem ByteBuffer
:
import java.security.MessageDigest
import java.nio.ByteBuffer
def emptyMessageDigest : MessageDigest = MessageDigest getInstance "SHA-256"
val updateDigest : (MessageDigest, ByteBuffer) => MessageDigest =
(messageDigest, byteBuffer) => {
messageDigest update byteBuffer
messageDigest
}
Diese beiden Funktionen können dann innerhalb einer Falte verwendet werden, die auf die entity
eines angewendet wird HttpResponse
den Digest mit allen ByteString
Werten in der Einheit aktualisieren:
import akka.http.scaladsl.model.HttpResponse
val responseBodyToDigest : HttpResponse => Future[MessageDigest] =
(_ : HttpResponse)
.entity
.dataBytes
.map(_.asByteBuffer)
.runFold(emptyMessageDigest)(updateDigest)
1
Verwenden Sie eine der Methoden MessageDigest.getInstance("SHA-256").update
.
Übergeben Sie Ihre Datei Stück für Stück.
nennen Dann digest()
Beispielcode:
MessageDigest instance = MessageDigest.getInstance("SHA-256");
for(byte[] arr: source){
instance.update(arr);
}
byte[] result = instance.digest();
2
Sie würden Flow
benötigen, die man Daten auf einem anderen Daten verwandeln. In Ihrem Fall möchten Sie reinen Text in sha256-Text umwandeln.
def digest(algorithm: String = "SHA-256"): Flow[ByteString, ByteString, NotUsed] = {
Flow[ByteString].fold(MessageDigest.getInstance(algorithm)){
case (digest: MessageDigest, bytes:ByteString) => {digest.update(bytes.asByteBuffer); digest}}
.map {case md: MessageDigest => ByteString(md.digest())}
}
Verwandte Themen
- 1. Entschlüsseln von SHA256
- 2. Rekord-Datenstrom von curl Textdatei
- 3. Drucken von Datenstrom aus Socket
- 4. JPEG-Datenstrom zu TImage
- 5. Finden von Trendthemen aus einem Datenstrom
- 6. Redis - Parse Datenstrom von Remote-Server
- 7. Echtzeit-Datenstrom zu Python von CSV-Datei
- 8. Konvertieren von SHA256 von Java zu C#
- 9. highland.js Async-Array zu Datenstrom
- 10. SHA256 in React Native
- 11. SHA256 Digest in Perl
- 12. Umgang mit Datenstrom mit Redux
- 13. HMAC-SHA256 in Delphi
- 14. ANTLR auf einem verrauschten Datenstrom
- 15. Aggregationszähler für einen vorhandenen Datenstrom
- 16. KeyAlgorithm für SHA256
- 17. sha256 mit PHP Sitzung
- 18. Drucken SHA256 Summe
- 19. SHA256 Leistungsoptimierung in C
- 20. Begünstigt SHA256 ganze Zahlen?
- 21. eine sha256 von der Befehlszeile Linux Generieren
- 22. Eine "reine" Schema-Implementierung (R5RS) von SHA256?
- 23. SHA256 in Swift - Importieren von Framework-Ausgabe
- 24. Verwenden Sie sha256 Hashes anstelle von Klartextpasswörtern
- 25. Textfilterung in PubNub Twitter Datenstrom
- 26. Angular - Problem mit asynchronem Datenstrom
- 27. Asynchronous SHA256 Hashing
- 28. NodeJS - SHA256 Passwortverschlüsselung
- 29. Dekodierung SHA256 Passwort
- 30. sha256 Verschlüsselung in erlang
gegebene Antwort erzeugt den falschen sha256 Wert. Wird berechnet, bevor der Stream abgeschlossen ist? Testcode: https://gist.github.com/rajeevprasanna/079813d9951da3016828b83f8fd09695 – Rajeev
@Rajeev Ich modifizierte das 'runWith' zu einem' runFold'. Versuch das... –