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

时间:2012-03-14 21:08:56

标签: java performance algorithm hash 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): - )

3 个答案:

答案 0 :(得分:1)

也许你可以调用用C编写的本机代码。必须有大量超级优化的SHA1库。

答案 1 :(得分:1)

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

您是在多核计算机上运行吗?您可以在单独的线程中运行zlib解压缩和SHA-1散列,使用java.util.concurrent.SynchronousQueue之类的东西将每个解压缩的64字节块从一个线程切换到另一个线程。这样你可以让一个核心散列一个块,而另一个核心解压缩下一个块。

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

我知道你说你已经优化了I / O,但你使用的是异步I / O吗?为了获得最大性能,您不希望对一个块进行散列,然后然后要求操作系统读取下一个块,您要让操作系统读取下一个块,然后散列您已经拥有的块。磁盘正忙于获取下一个磁盘。然而,操作系统可能已经做了一些预读,所以这可能没有太大的区别。

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

答案 2 :(得分:0)

您是否尝试将文件处理切换为内存映射文件?这些性能往往比常规IO和NIO快得多。