我有一個用例,我正在使用GET請求從URL下載文件。是否有可能計算文件流的SHA256而不保存到磁盤或將整個對象保存在內存中?SHA256的數據流
2
A
回答
2
這可以用一個MessageDigest
和Sink.fold
來完成。
首先,我們需要一個函數來創建一個空的摘要和一個函數來更新的摘要與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
}
這兩個函數然後可以被施加到的所述entity
的摺疊內使用HttpResponse
與在實體所有ByteString
值更新摘要:
import akka.http.scaladsl.model.HttpResponse
val responseBodyToDigest : HttpResponse => Future[MessageDigest] =
(_ : HttpResponse)
.entity
.dataBytes
.map(_.asByteBuffer)
.runFold(emptyMessageDigest)(updateDigest)
1
使用MessageDigest.getInstance("SHA-256").update
方法之一。
將您的文件逐個傳遞給它。
然後調用digest()
示例代碼:
MessageDigest instance = MessageDigest.getInstance("SHA-256");
for(byte[] arr: source){
instance.update(arr);
}
byte[] result = instance.digest();
2
您需要Flow
將一個數據轉換到另一個數據。在你的情況下,你想要將純文本轉換爲sha256文本。
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())}
}
相關問題
- 1. SQL Server中的sha256函數
- 2. Java sha256不匹配Swift sha256
- 3. 如何在sha256中sha256與sha256的哈希輸出
- 4. 從數據存儲流入數據流?
- 5. 用計數器模式用SHA256加密數據是否聰明?
- 6. Delphi中的HMAC-SHA256
- 7. OpenSSL的SHA256差異
- 8. React Native中的SHA256
- 9. SHA256哈希中的字符數
- 10. 如何使用OpenSSL的SHA256函數
- 11. 流數據
- 12. Youtube數據流
- 13. 數據流圖
- 14. 在數據流
- 15. 數據流圖?
- 16. 流數據
- 17. Flex流數據
- 18. HTTP數據流
- 19. Reactjs - 數據流
- 20. 店SHA256串DB
- 21. SHA256 in Crypto ++ library
- 22. SuiteScript hmac sha256
- 23. AES加密,SHA256
- 24. .NET SHA256 Vs Object.GetHashCode()
- 25. 散列與SHA256
- 26. loadrunner HMAC-SHA256
- 27. 雙哈希SHA256
- 28. 非SHA256字符
- 29. hmac-sha256支持
- 30. SSIS:控制流中的數據挖掘查詢與數據流
給出的答案是生產錯SHA256值。流完成前計算嗎?測試代碼:https://gist.github.com/rajeevprasanna/079813d9951da3016828b83f8fd09695 – Rajeev
@Rajeev我將'runWith'修改爲'runFold'。試試... –