Domanda

Devo verificare la firma su un file che può essere grande quanto 2Gb e voglio farlo nel modo più efficiente possibile in termini di memoria. Per vari motivi, il file verrà già caricato completamente in memoria e sarà accessibile tramite un InputStream dall'applicazione. Vorrei verificare la firma utilizzando l'interfaccia dello stream, ma il metodo JCA Signature class ' update accetta solo byte [] e le classi correlate.

Come posso farlo in modo efficiente? Non voglio caricare la bestia in un array di secondo byte, altrimenti vedremo un uso della memoria molto elevato, ma l'interfaccia non sembra supportarla altrimenti.

Aggiorna

Se è importante, l'algoritmo di firma è SHA-1

È stato utile?

Soluzione

Perché non leggere semplicemente il flusso di input un blocco (4096 byte o qualsiasi dimensione conveniente) alla volta, chiamare update () per ciascun blocco.

Altri suggerimenti

Crea un array di byte che funga da buffer e leggi il buffer alla volta da InputStream, chiamando update () sulla firma ogni volta. A condizione che il buffer abbia dimensioni ragionevoli, è probabile che il tempo CPU impiegato per il trasferimento dei dati da un processo a un altro (immagino sia quello che stai facendo?) Sia trascurabile rispetto al tempo di calcolo. Nel caso della lettura da disco, il punto di interruzione per un ritorno trascurabile sull'utilizzo della CPU sembra avere una dimensione del buffer di circa 8 KB, e sospetto che ciò si applichi più o meno anche nel tuo caso. (Nel caso sia interessante, consulta la pagina che ho creato su Dimensioni buffer InputStream .)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top