2012-02-20 34 views
2

當前我正在嘗試生成大型數據文件(10mb +)的MD5。我當前的邏輯生成一個MD5,但是切斷了MD5的第一個字符。此外,這個過程相當緩慢,至少需要三十秒以上。MD5的生成速度很慢並且缺少第一個字符

我該如何才能切斷MD5的第一個字符?

如何加快生成過程?

修訂當前代碼:

File PATH = Environment.getExternalStorageDirectory(); 
    File DATAFILE = new File(PATH + "/stuff/content/" + FILE); 

    Context context = MyApp.getAppContext(); 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    FileInputStream fis = new FileInputStream(DATAFILE); 
    BufferedInputStream in = new BufferedInputStream(fis); 

    // generate MD5 
    byte[] dataBytes = new byte[1024]; 
    int byteCount; 
    while ((byteCount = in.read(dataBytes)) > 0) { 
     md.update(dataBytes, 0, byteCount); 
    } 
    byte[] digest = md.digest(); 

    // convert to readable string 
    String MD5; 
    StringBuffer hexString = new StringBuffer(); 
    for (int i=0; i<digest.length; i++) 
     hexString.append(Integer.toHexString(0xFF & digest[i])); 
    MD5 = hexString.toString(); 

    Log.i("GENERATED MD5", MD5); 

結果: 02-19 15:44:59.528:I/GENERATED MD5(24222):cd8f8438957ea9db758ddd12d86e2ca

應該是: 「MD5」: 「0cd8f8438957ea9db758ddd12d86e2ca」

謝謝。

回答

3

您爲輸入數據中的每個字節調用BuffererdInputStream.read()和MessageDigest.update()一次。

而是使用一個字節數組作爲緩衝區並調用這些函數的數組形式,它可能會更快。

編輯:

您的字符串不匹配的原因是因爲第一個字節的最高位是0,所以Integer.toHexString()是當你想到「0℃」返回「C」。

您可以通過使用String.format填充十六進制數字來解決此問題。

hexString.append(Integer.toHexString(0xFF & digest[i])); 

對此(不需要0xFF &因爲你有個字節已經工作):

從改變你的代碼

hexString.append(String.format("%02x", digest[i])); 
+0

但是,這是否會導致我錯過了第一個字符? – 2012-02-20 04:18:27

+0

修正了邏輯。看看上面。仍然得到相同的結果... – 2012-02-20 04:37:15

+0

仍然有缺少第一個字符的問題...張貼我最新的邏輯。 – 2012-02-20 16:19:49

-1

這是解決我的問題。在我以前的邏輯中,似乎有一個缺陷,只有當第一個字符爲零時纔會發生。有趣的是爲什麼更多的例子不包括我下面的內容。

// convert to readable string 
    String MD5; 
    StringBuffer hexString = new StringBuffer(); 

    for (int i = 0; i < digest.length; i++) { 
     String hex = Integer.toHexString(0xFF & digest[i]); 
     if (hex.length() == 1) { 
      hexString.append('0'); 
     } 
     hexString.append(hex); 
    } 

    MD5 = hexString.toString(); 

    Log.i("GENERATED MD5", MD5); 
+0

Yuck!對不起,這是一個很難解決問題的方法 - 查看我的編輯以獲得更好的方法。 – 2012-02-21 08:06:43