Vérifiez efficacement la signature sur de grands ensembles de données à l'aide de JCA
-
03-07-2019 - |
Question
Je dois vérifier la signature sur un fichier pouvant aller jusqu'à 2 Go, et je souhaite le faire de manière à optimiser l'efficacité de la mémoire. Pour diverses raisons, le fichier sera déjà chargé complètement dans la mémoire et est accessible à l'aide d'un InputStream
par l'application. Je souhaite vérifier la signature à l'aide de l'interface de flux, mais la méthode JCA Signature
de la classe update
n'accepte que les codes octet []
et les classes associées.
Comment puis-je le faire efficacement? Je ne veux pas charger la bête dans un second tableau d'octets, sinon nous verrons une utilisation sérieuse de la mémoire, mais l'interface ne semble pas la prendre en charge autrement.
Mettre à jour
Si cela compte, l'algorithme de signature est SHA-1
La solution
Pourquoi ne pas simplement lire dans le flux d'entrée un bloc (4096 octets ou une taille convenable) à la fois, appelez update () pour chaque bloc.
Autres conseils
Créez un tableau d'octets faisant office de tampon et lisez le tampon à la fois depuis InputStream, en appelant update () à la signature à chaque fois. À condition que la taille de la mémoire tampon soit raisonnable, le temps CPU nécessaire au transfert des données d'un processus à un autre (je suppose que c'est ce que vous faites?) Sera probablement négligeable par rapport au temps de calcul. Dans le cas de la lecture sur disque, le point de coupure pour un rendement négligeable sur l'utilisation du processeur semble être une taille de mémoire tampon d'environ 8 Ko, et je suppose que cela s'appliquera plus ou moins à votre cas également. (Si cela vous intéresse, reportez-vous à la page que j’ai réunie à la tailles de mémoire tampon InputStream . .)