目前我正在尝试生成大型数据文件(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;
感谢。
答案 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);