MD5的生成很慢并且缺少第一个字符

时间:2012-02-20 00:00:21

标签: android

目前我正在尝试生成大型数据文件(10mb +)的MD5。我当前的逻辑生成一个MD5,但正在切断MD5的第一个字符。此外,这个过程相当缓慢,至少需要30秒才能完成。

我怎么能不让它切断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

应该是: &#34; MD5&#34;:&#34; 0cd8f8438957ea9db758ddd12d86e2ca&#34;

感谢。

2 个答案:

答案 0 :(得分:3)

您为输入数据中的每个字节调用一次BuffererdInputStream.read()和MessageDigest.update()。

而是使用字节数组作为缓冲区并调用这些函数的数组形式,它可能会更快。

修改

你的字符串不匹配的原因是因为第一个字节的顶部位是0,所以当你期望“0c”时Integer.toHexString()返回“c”。

您可以使用String.format通过零填充十六进制数字来解决此问题。

更改您的代码:

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

对此(由于您已经使用了字节,因此不需要0xFF &):

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

答案 1 :(得分:-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);