使用 hashlib 或其他方法将 Java MD5 'java.security.MessageDigest.getInstance( "MD5" )' 代码转换为 Python2.7



java代码:

public static String md5(byte[] source) throws NoSuchAlgorithmException {
    char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
    md.update(source);
    byte tmp[] = md.digest();
    char str[] = new char[32];
    int k = 0;
    for (int i = 0; i < 16; i++) {
      str[k++] = hexDigits[tmp[i] >>> 4 & 0xf];
      str[k++] = hexDigits[tmp[i] & 0xf];
    }
    return new String(str);
  }

和该代码,输入:

77,48,48,47,48,48,47,48,48,47,114,66,65,72,104,108,120,121,80,107,113,65,89,90,78,106,65,65,67,102,97,85,116,51,77,89,52,55,53,46,106,112,101,103,49,49

返回:

2fa040f96503fdabf5fd171da1473069

然后在python2.7中,我的代码:

def md5(string):
    m = hashlib.md5()
    m.update(string)
    return m.hexdigest()

相同的输入和返回:

e480188fdf66deeec3d5a2c42094dd73

那么如何编辑我的python代码以具有相同的返回?

仔细查看您的输入字符串774848474848474848471146665721...它看起来像是代表ASCII字符的串联字节值序列:

77 48 48 47 48 48 47 48 48 47 114 66 65 72 ...

将这些转换为字符我们获得字符串M00/00/00/rBAHhlxyPkqAYZNjAACfaUt3MY475.jpeg11

计算M00/00/00/rBAHhlxyPkqAYZNjAACfaUt3MY475.jpeg11的MD5哈希,我得到2fa040f96503fdabf5fd171da1473069。这是您的Java代码返回的哈希。

另一方面,计算字符串774848474848474848471146665721...的MD5哈希返回e480188fdf66deeec3d5a2c42094dd73。这是您的python代码返回的哈希。

我已经能够使用您的Java代码和您的Python代码来计算这两个哈希,并在两者中获得相同的结果。要将字符串转换为Java中的byte数组,我在字符串上称为.getBytes("UTF-8")。(我使用Python 3而不是Python 2,因此必须插入.encode("utf-8")的呼叫,但这是旁边的。)

因此,用于计算MD5哈希的Java和Python代码样本正在返回不同的结果,因为您正在传递它们不同的输入数据。

最新更新