Java中的最大SHA-1哈希性能提示

Mut*_*pus 5 java algorithm hash performance sha1

我正在编写一个需要计算SHA-1哈希值的Java库.在一项常见任务中,JVM花费大约70%的时间sun.security.provider.SHA.implCompress,10%java.util.zip.Inflater.inflate和2%sun.security.provider.ByteArrayAccess.b2iBig64.(根据NetBeans分析器.)

我似乎无法获得Google搜索关键字以获得相关结果.我对SHA-1哈希算法不是很熟悉.如何从SHA-1中获得最佳性能MessageDigest?是否有一些我应该消化的块大小,或者我应该尝试的特定大小的倍数?

回答你正在考虑的一些问题:

  • 是的,当我读取文件(MessageDigest.update)时,我正在消化,所以字节只被消化一次.
  • SHA-1摘要用作校验和,通常用于需要zlib/inflated的文件.
  • 不,我不能使用不同的哈希.
  • 是的,我知道zlib已经使用了校验和,但外部要求指定使用SHA-1哈希.我不能提出一个很好的理由(如果可以的话,+1):-)

Wyz*_*a-- 1

SHA-1 的块大小为 64 字节,因此最好是其倍数;否则,实现将需要将部分块复制到缓冲区中。

您在多核计算机上运行吗?您可以在单独的线程中运行 zlib 解压缩和 SHA-1 哈希,使用类似java.util.concurrent.SynchronousQueue将每个解压缩的 64 字节块从一个线程移交给另一个线程的方法。这样,您就可以让一个核心对一个块进行哈希处理,而另一个核心则对下一个块进行解压缩。

(您可以尝试具有一定存储容量的其他实现之一BlockingQueue,但我认为这没有多大帮助。解压缩比散列快得多,因此 zlib 线程会快速填满队列,然后它' d 必须等待放置每个新块,就像 一样SynchronousQueue。)

我知道你说过你已经优化了 I/O,但是你使用异步 I/O 吗?为了获得最大性能,您不想散列一个块,然后要求操作系统读取下一个块,您希望要求操作系统读取下一个块,然后在磁盘忙于获取下一个块时对您已有的块进行散列一。然而,操作系统可能已经做了一些预读,所以这可能不会产生很大的影响。

但除此之外,加密哈希函数是一件复杂的事情;只是需要时间来运行。也许您需要一台更快的计算机。:-)