Controlla la firma su set di dati di grandi dimensioni in modo efficiente utilizzando JCA
-
03-07-2019 - |
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
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 .)