Pregunta

Tengo que verificar la firma en un archivo que puede ser tan grande como 2 Gb, y quiero hacerlo de una manera que sea lo más eficiente posible en cuanto a memoria. Por varias razones, el archivo ya se cargará completamente en la memoria, y la aplicación accede a él mediante un InputStream . Me gustaría verificar la firma utilizando la interfaz de transmisión, pero el método Firma clase ' actualizar de JCA solo acepta byte [] y clases relacionadas.

¿Cómo puedo hacer esto de manera eficiente? No quiero cargar la bestia en un segundo conjunto de bytes, de lo contrario, veremos un uso muy alto de memoria, pero la interfaz no parece admitirlo de otra manera.

Actualizar

Si es importante, el algoritmo de firma es SHA-1

¿Fue útil?

Solución

¿Por qué no solo leer el flujo de entrada de un bloque (4096bytes o cualquier tamaño conveniente) a la vez, llamar a update () para cada bloque.

Otros consejos

Cree una matriz de bytes para que actúe como buffer y lea el buffer a la vez desde InputStream, llamando a update () en la Firma cada vez. Siempre que el búfer sea de un tamaño razonable, el tiempo de CPU consumido transfiriendo los datos de un proceso a otro (supongo que eso es lo que está haciendo) es probable que sea insignificante en comparación con el tiempo de cálculo. En el caso de la lectura desde el disco, el punto de corte para un retorno insignificante en el uso de la CPU parece ser un tamaño de búfer de alrededor de 8K, y sospecho que esto también se aplicará más o menos en su caso. (En caso de que sea interesante, consulte la página que reuní sobre Tamaños de búfer InputStream .)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top