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 的块大小为 64 字节,因此最好是其倍数;否则,实现将需要将部分块复制到缓冲区中。
您在多核计算机上运行吗?您可以在单独的线程中运行 zlib 解压缩和 SHA-1 哈希,使用类似java.util.concurrent.SynchronousQueue将每个解压缩的 64 字节块从一个线程移交给另一个线程的方法。这样,您就可以让一个核心对一个块进行哈希处理,而另一个核心则对下一个块进行解压缩。
(您可以尝试具有一定存储容量的其他实现之一BlockingQueue,但我认为这没有多大帮助。解压缩比散列快得多,因此 zlib 线程会快速填满队列,然后它' d 必须等待放置每个新块,就像 一样SynchronousQueue。)
我知道你说过你已经优化了 I/O,但是你使用异步 I/O 吗?为了获得最大性能,您不想散列一个块,然后要求操作系统读取下一个块,您希望要求操作系统读取下一个块,然后在磁盘忙于获取下一个块时对您已有的块进行散列一。然而,操作系统可能已经做了一些预读,所以这可能不会产生很大的影响。
但除此之外,加密哈希函数是一件复杂的事情;只是需要时间来运行。也许您需要一台更快的计算机。:-)