Android的字符串哈希与serverisde不匹配

时间:2014-12-26 13:22:17

标签: java php android hash

我正在开发一款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:)

2 个答案:

答案 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")

如果你不能。