2009-01-02 4 views
1

Je dois vérifier la signature sur un fichier pouvant contenir jusqu'à 2 Go, et je souhaite le faire de la manière la plus efficace possible. Pour diverses raisons, le fichier sera déjà complètement chargé dans la mémoire, et est accessible à l'aide d'un InputStream par l'application. Je voudrais vérifier la signature en utilisant l'interface de flux, mais la méthode de classe JCA Signature 'update accepte seulement byte[] et les classes liées.Vérification efficace de la signature sur de grands ensembles de données à l'aide de JCA

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 de mémoire très sérieuse, mais l'interface ne semble pas le supporter autrement.

Mise à jour

S'il importe, l'algorithme de signature est SHA-1

Répondre

2

Pourquoi ne pas lire juste l'entrée flux un bloc (4096bytes ou quelle que soit la taille pratique) à la fois, la mise à jour d'appel() pour chaque bloc.

+0

J'aime le son de celui-ci; does 'update()' vider les blocs précédemment mis à jour? –

+0

Je suppose qu'il est destiné à mettre à jour la signature itérativement pour l'entrée donnée, et à la fin vous appelez une méthode "finish()" ... avez-vous un lien vers une page qui décrit la classe Signature? Je ne pouvais pas trouver autre chose qu'une vague description. –

1

Créez un tableau d'octets pour agir comme un buffer et lisez le tampon à la fois à partir de l'InputStream, en appelant update() sur la signature à chaque fois. A condition que la mémoire tampon soit de taille raisonnable, le temps CPU consommé pour transférer les données d'un processus à un autre (je suppose que c'est ce que vous faites?) Risque d'être négligeable par rapport au temps de calcul. Dans le cas d'une lecture à partir d'un disque, le point de coupure pour un rendement négligeable sur l'utilisation du processeur semble être une taille de tampon d'environ 8K, et je suppose que cela s'appliquera plus ou moins dans votre cas. (Dans le cas où c'est intéressant, voir la page que j'ai mis ensemble sur InputStream buffer sizes.)

Questions connexes