我必须验证可能大至 2Gb 的文件上的签名,并且我希望以尽可能节省内存的方式进行验证。由于各种原因,该文件已经完全加载到内存中,InputStream
并由应用程序使用访问。我想使用流接口验证签名,但是 JCASignature
类的update
方法只接受byte[]
和相关的类。
我怎样才能有效地做到这一点?我不想将野兽加载到第二个字节数组中,否则我们会看到一些严重的高内存使用,但接口似乎不支持它。
更新
如果重要,签名算法是 SHA-1
我必须验证可能大至 2Gb 的文件上的签名,并且我希望以尽可能节省内存的方式进行验证。由于各种原因,该文件已经完全加载到内存中,InputStream
并由应用程序使用访问。我想使用流接口验证签名,但是 JCASignature
类的update
方法只接受byte[]
和相关的类。
我怎样才能有效地做到这一点?我不想将野兽加载到第二个字节数组中,否则我们会看到一些严重的高内存使用,但接口似乎不支持它。
更新
如果重要,签名算法是 SHA-1
为什么不一次读取输入流一个块(4096 字节或任何方便的大小),为每个块调用 update()。
创建一个字节数组作为缓冲区,并从 InputStream 中一次读取缓冲区,每次在 Signature 上调用 update()。如果缓冲区的大小合理,则将数据从一个进程传输到另一个进程所消耗的 CPU 时间(我猜这就是您正在做的事情?)与计算时间相比可能可以忽略不计。在从磁盘读取的情况下,CPU 使用率回报可忽略不计的截止点似乎是大约 8K 的缓冲区大小,我怀疑这或多或少也适用于您的情况。(如果它很有趣,请参阅我放在一起的页面InputStream 缓冲区大小。)