Verifique a assinatura em grandes conjuntos de dados de forma eficiente usando JCA
-
03-07-2019 - |
Pergunta
Eu tenho que verificar a assinatura em um arquivo que pode ser tão grande quanto 2GB, e eu quero fazê-lo de uma forma que é como memória-eficiente possível. Por várias razões, o arquivo já será carregado completamente na memória, e é acessado usando um InputStream
pela aplicação. Gostaria de verificar a assinatura usando a interface transmitir, mas a classe Signature
método update
JCA só aceita byte[]
e classes relacionadas.
Como posso fazer isso de forma eficiente? Eu não quero carregar a besta em uma segunda matriz de bytes, caso contrário, nós estaremos vendo algum uso sério de memória alta, mas a interface não parece apoiá-lo de outra forma.
Atualizar
Se é importante, o algoritmo de assinatura é SHA-1
Solução
Porque não basta ler o fluxo de entrada de um bloco (4096bytes ou o tamanho conveniente) de cada vez, atualização call () para cada bloco.
Outras dicas
Criar um array de bytes para agir como um tampão e ler tampão em um momento a partir do InputStream, chamando update () na assinatura de cada vez. Desde que o tampão é de um tamanho razoável, o tempo de CPU consumido transferir os dados de um processo para outro (Eu estou supondo que é o que você está fazendo?) É susceptível de ser insignificante em comparação com o tempo de cálculo. No caso de leitura do disco, o ponto de corte para o retorno insignificante sobre o uso da CPU parece ser um tamanho de buffer de cerca de 8K, e eu suspeito que isso vai mais ou menos se aplicam no seu caso também. (No caso é interessante, consulte a página eu coloquei na InputStream tampão tamanhos .)