java sha256hash_Java:有效地计算大文件的SHA-256哈希

小编典典

我的解释可能无法解决您的问题,因为它很大程度上取决于您的实际运行时环境,但是当我在系统上运行您的代码时,吞吐量受磁盘I /

O限制,而不是哈希计算。通过切换到NIO并不能解决问题,而仅仅是由于您以很小的片段(16kB)读取文件的事实而引起的。将系统上的缓冲区大小(buff)增加到1MB而不是16kB会使吞吐量增加一倍以上,但是以>

50MB / s的速度,我仍然受到磁盘速度的限制,无法完全加载单个CPU内核。

顺便说一句:您可以通过将DigestInputStream包裹在FileInputStream周围,通读文件并从DigestInputStream获取计算得出的哈希值,而不是像代码中那样将数据从RandomAccessFile手动改组为MessageDigest,来大大简化实现。

我使用较旧的Java版本进行了一些性能测试,这里的Java 5和Java

6之间似乎存在相关差异。我不确定是否优化了SHA实施,或者VM是否以更快的速度执行代码。我使用不同的Java版本(1MB缓冲区)获得的吞吐量为:

Sun JDK 1.5.0_15(客户端):28MB / s,受CPU限制

Sun JDK 1.5.0_15(服务器):45MB / s,受CPU限制

Sun JDK 1.6.0_16(客户端):42MB / s,受CPU限制

Sun JDK 1.6.0_16(服务器):52MB / s,受磁盘I / O限制(85-90%CPU负载)

我对CryptoPP

SHA实现中的汇编程序部分的影响有些好奇,因为基准测试结果表明SHA-256算法在Opteron上仅需要15.8个CPU周期/字节。不幸的是,我无法在cygwin上用gcc构建CryptoPP(构建成功,但是生成的exe立即失败),但是在VS2005(默认发行版配置)下建立了性能基准,并在CryptoPP中支持汇编器和不使用汇编器,并与Java

SHA进行了比较。在内存缓冲区中实现,不考虑任何磁盘I / O,我在2.5GHz Phenom上获得以下结果:

Sun JDK1.6.0_13(服务器):26.2个周期/字节

CryptoPP(仅C ++):21.8个周期/字节

CryptoPP(汇编器):13.3周/字节

这两个基准测试都计算一个4GB空字节数组的SHA哈希,以1MB的块对其进行迭代,然后将其传递到MessageDigest#update(Java)或CryptoPP的SHA256.Update函数(C

++)。

我能够在运行Linux的虚拟机中使用gcc 4.4.1(-O3)构建和基准测试CryptoPP。与VS

exe的结果相比,吞吐量提高了一半。我不确定对虚拟机造成的差异有多少,以及由VS通常产生比gcc更好的代码所导致的差异,但是我现在无法从gcc获得任何更准确的结果。

2020-10-18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值