Android MD5的生成速度慢,缺少第一个字符
目前,我正在尝试生成一个大数据文件(10mb+)的MD5。我当前的逻辑生成了一个MD5,但正在删除MD5的第一个字符。而且,这个过程相当缓慢,至少需要30秒甚至更长时间 我如何不让它切断MD5的第一个字符 如何加快生成过程 更新当前代码:Android MD5的生成速度慢,缺少第一个字符,android,Android,目前,我正在尝试生成一个大数据文件(10mb+)的MD5。我当前的逻辑生成了一个MD5,但正在删除MD5的第一个字符。而且,这个过程相当缓慢,至少需要30秒甚至更长时间 我如何不让它切断MD5的第一个字符 如何加快生成过程 更新当前代码: File PATH = Environment.getExternalStorageDirectory(); File DATAFILE = new File(PATH + "/stuff/content/" + FILE); Con
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);
File PATH=Environment.getExternalStorageDirectory();
文件数据文件=新文件(路径+“/stuff/content/”+文件);
Context=MyApp.getAppContext();
MessageDigest md=MessageDigest.getInstance(“MD5”);
FileInputStream fis=新的FileInputStream(数据文件);
BufferedInputStream in=新的BufferedInputStream(fis);
//生成MD5
字节[]数据字节=新字节[1024];
int字节数;
而((字节数=in.read(数据字节))>0){
md.update(数据字节,0,字节数);
}
字节[]摘要=md.digest();
//转换为可读字符串
字符串MD5;
StringBuffer hexString=新的StringBuffer();
对于(int i=0;i您(正在)为输入数据中的每个字节调用一次BuffererdInputStream.read()和MessageDigest.update()
相反,使用字节数组作为缓冲区并调用这些函数的数组形式,可能会更快
编辑:
字符串不匹配的原因是因为第一个字节的顶部位是0,所以Integer.toHexString()
在预期为“0c”时返回“c”
您可以通过使用String.format将十六进制数字填充为零来解决此问题
将代码更改为:
hexString.append(Integer.toHexString(0xFF & digest[i]));
为此(不需要0xFF&
,因为您已经在处理字节了):
这就解决了我的问题。我之前的逻辑似乎有一个缺陷,只有当第一个字符为零时才会出现。有趣的是,为什么更多的例子没有包括我下面的内容
// 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);
//转换为可读字符串
字符串MD5;
StringBuffer hexString=新的StringBuffer();
for(int i=0;i
但这会导致我丢失第一个字符吗?仍然存在丢失第一个字符的问题…发布了我的最新逻辑。糟糕!抱歉,这是一种非常棘手的解决问题的方法-查看我的编辑,以获得更好的方法。
// 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);