【问题标题】:Android: Faster way to compute hashAndroid:计算哈希的更快方法
【发布时间】:2014-06-18 17:10:42
【问题描述】:

此代码将计算 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) ; 更好的方法来处理整个文件;我该怎么办?

【问题讨论】:

  • 不确定是否可以更快地完成,因为我很少接触散列,但只是一个提示:我认为最好将其放在AsyncTaskThread 上,而不是防止锁定 UI。 Official doc
  • 也许可以试试其他版本的read() 读入一个数组? docs.oracle.com/javase/7/docs/api/java/security/…, int, int)
  • 当然可以,但您仍在等待大约 10 秒 :)
  • 如果我不想要内容(假设这是一个 3GB 的文件),如何避免不必要的副本堵塞内存?
  • 那么可以分块读取文件吗?分配一些大小的数组并调用read(),但是您需要多次访问整个文件?

标签: java android hash


【解决方案1】:

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

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 秒的地方立即返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2011-07-30
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多