Android:更快速地计算哈希值

时间:2014-05-02 04:54:11

标签: java android hash

此代码将计算URI的哈希值:

protected void ShowHash(android.net.Uri uri) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
        BufferedInputStream is = new BufferedInputStream(getContentResolver().openInputStream(uri));
        DigestInputStream dis = new DigestInputStream(is, md);
        while(dis.read() != -1) ;
        Toast.makeText(getApplicationContext(), bytesToHex(md.digest()),
                Toast.LENGTH_LONG).show();
    } catch(Exception e) {
        Toast.makeText(getApplicationContext(), e.toString(),
                Toast.LENGTH_LONG).show();
    }
    return;
}

但是对于一个体面的文件(例如,一张2MB的图片),这将持续大约10秒,这是一个荒谬的时间。显然,处理整个文件的方法比while(dis.read() != -1) ;更好;我应该怎么做呢?

1 个答案:

答案 0 :(得分:2)

更好的方法是以更大的块读取文件。这避免了每个字节的许多函数调用的开销。当然,您不希望将整个文件读入内存,因此您只需使用一个小缓冲区:

protected void ShowHash(android.net.Uri uri) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
        BufferedInputStream is = new BufferedInputStream(getContentResolver().openInputStream(uri));
        DigestInputStream dis = new DigestInputStream(is, md);
        byte[] buffer = new byte[1024];
        while(dis.read(buffer, 0, buffer.length) != -1) ;
        Toast.makeText(getApplicationContext(), bytesToHex(md.digest()),
                Toast.LENGTH_LONG).show();
    } catch(Exception e) {
        Toast.makeText(getApplicationContext(), e.toString(),
                Toast.LENGTH_LONG).show();
    }
    return;
}

此功能可立即返回原始功能大约需要10秒的时间。