2011-04-06 4 views
11

Ho un problema con le prestazioni SHA-1 su Android. In C# viene calcolato hash in circa 3 secondi, lo stesso calcolo per Android richiede circa 75 secondi. Penso che il problema sia nella lettura dell'operazione da file, ma non sono sicuro di come migliorare le prestazioni.Android, calcolo dell'hash SHA-1 dal file, algoritmo più veloce

Ecco il mio metodo di generazione hash.

private static String getSHA1FromFileContent(String filename) 
    { 

     try 
     { 
      MessageDigest digest = MessageDigest.getInstance("SHA-1"); 
      //byte[] buffer = new byte[65536]; //created at start. 
      InputStream fis = new FileInputStream(filename); 
      int n = 0; 
      while (n != -1) 
      { 
       n = fis.read(buffer); 
       if (n > 0) 
       { 
        digest.update(buffer, 0, n); 
       } 
      } 
      byte[] digestResult = digest.digest(); 
      return asHex(digestResult); 
     } 
     catch (Exception e) 
     { 
      return null; 
     } 
    } 

Qualche idea, come posso migliorare le prestazioni?

+0

qual è la dimensione del file che stai leggendo? – SirDarius

+0

Prova a eseguire il codice senza il metodo 'asHex (..)' (restituisci solo byte []). –

+0

Sto usando un file da 6 MB, rimuovere asHex (..) non ha aiutato:/ –

risposta

4

L'ho provato sul mio SGS (i9000) e ci sono voluti 0.806 secondi per generare l'hash per un file da 10.1 MB.

unica differenza è che nel mio codice sto usando BufferedInputStream oltre al FileInputStream e la libreria di conversione esadecimale trovato in:

http://apachejava.blogspot.com/2011/02/hexconversions-convert-string-byte-byte.html

Inoltre vorrei suggerire che si chiude il flusso di input file di in una clausola finale

+2

Questo link è stato interrotto a partire dal 11/10/15. – keithbhunter

+0

Collegamento interrotto nel 2017. – jpros

1

Se fossi in te vorrei use the JNI like this guy did e ottenere la velocità in quel modo. Questo è esattamente ciò per cui è stata realizzata l'interfaccia C.