我正在开发一款Android应用,我需要将一些数据从服务器发送到Android设备。
为了防止应用程序下载太多数据,我写了一个php服务,它接受Android提供的哈希(最后下载数据的md5哈希值)并将其与服务器上的最新数据哈希进行比较。如果哈希相互匹配,则会打印“no_new_data”,否则会打印最新数据。 Php使用md5($ string)方法来计算哈希值 - 这部分似乎工作正常。
问题是在设备上计算的哈希值永远不会与服务器的哈希值匹配 - 这是错误的,即使字符串似乎相同。我甚至尝试改变编码,但它没有帮助。
我的md5 java代码: public static String md5(String base){ 尝试{ MessageDigest md = MessageDigest.getInstance(“MD5”); md.update(base.getBytes());
byte byteData[] = md.digest();
//convert the byte to hex format method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
//System.out.println("Digest(in hex format):: " + sb.toString());
//convert the byte to hex format method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<byteData.length;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}catch (Exception e){
return "a";
}
}
Thnks:)
答案 0 :(得分:1)
有时md5哈希与服务器端哈希不同。试试这个方法。
public static String getMD5Hash(String s) throws NoSuchAlgorithmException {
String result = s;
if (s != null) {
MessageDigest md = MessageDigest.getInstance("MD5"); // or "SHA-1"
md.update(s.getBytes());
BigInteger hash = new BigInteger(1, md.digest());
result = hash.toString(16);
while (result.length() < 32) { // 40 for SHA-1
result = "0" + result;
}
}
return result;
}
答案 1 :(得分:0)
永远不要使用String.getBytes()
,这取决于平台默认字符集,这几乎不是你想要的。 Android和您的服务器端之间的平台默认字符集似乎有所不同。
将其传递给Charset,例如
myString.getBytes(StandardCharsets.UTF_8)
如果你有Java 7或
myString.getBytes("UTF-8")
如果你不能。