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

Foi útil?

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 .)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top