Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android MD5的生成速度慢,缺少第一个字符_Android - Fatal编程技术网

Android MD5的生成速度慢,缺少第一个字符

Android MD5的生成速度慢,缺少第一个字符,android,Android,目前,我正在尝试生成一个大数据文件(10mb+)的MD5。我当前的逻辑生成了一个MD5,但正在删除MD5的第一个字符。而且,这个过程相当缓慢,至少需要30秒甚至更长时间 我如何不让它切断MD5的第一个字符 如何加快生成过程 更新当前代码: File PATH = Environment.getExternalStorageDirectory(); File DATAFILE = new File(PATH + "/stuff/content/" + FILE); Con

目前,我正在尝试生成一个大数据文件(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);
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);