Md5 PHP和android不一样



我正在计算一个文件的md5,但得到不同的结果

代码:

 public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState);
AssetManager am = getResources().getAssets();
String as = null;
try {
    InputStream is=am.open("sdapk.db");
    as=is.toString();
}catch(IOException e) {
    Log.v("Error_E",""+e);
}
String  res = md5(as);
TextView tv = new TextView(this);
tv.setText(res);
setContentView(tv);
}
public String md5(String s) { 
try { 
    MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(s.getBytes()); byte messageDigest[] = digest.digest();
 // Create Hex String
 StringBuffer hexString = new StringBuffer();
 for (int i=0; i<messageDigest.length; i++)
     hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
 e.printStackTrace();
}
return "";
}
}

php md5: E959637E4E88FDEC377F0A15A109BB9A

InputStream.toString()可能不做您希望它做的事情。它在正常的JDK中没有被覆盖,所以它基本上是Object.toString()…它会返回一个字符串,比如"java.io.InputStream@12345678"。即使Android的东西确实返回一个表示流内容的字符串,它也会变得非常奇怪,因为你从来没有指定使用什么编码来将字节转换为字符。

如果你想MD5,你应该读入流。有点像

private static char[] hexDigits = "0123456789abcdef".toCharArray();
public String md5(InputStream is) throws IOException
{
    byte[] bytes = new byte[4096];
    int read = 0;
    MessageDigest digest = MessageDigest.getInstance("MD5");
    while ((read = is.read(bytes)) != -1)
    {
        digest.update(bytes, 0, read);
    }
    byte[] messageDigest = digest.digest();
    StringBuilder sb = new StringBuilder(32);
    // Oh yeah, this too.  Integer.toHexString doesn't zero-pad, so
    // (for example) 5 becomes "5" rather than "05".
    for (byte b : messageDigest)
    {
        sb.append(hexDigits[(b >> 4) & 0x0f]);
        sb.append(hexDigits[b & 0x0f]);
    }
    return sb.toString();
}

最新更新