Encoding 跨平台生成MD5哈希时的字符编码问题

Encoding 跨平台生成MD5哈希时的字符编码问题,encoding,utf-8,md5,set,character,Encoding,Utf 8,Md5,Set,Character,这是在各种语言中使用MD5库时有关字符编码的一般问题。我关心的是:假设我使用本机Python字符串对象生成MD5哈希,如下所示: message = "hello world" m = md5() m.update(message) 然后我使用以下方法获取MD5哈希的十六进制版本: m.hexdigest() 并通过网络发送消息&MD5散列,比如JMS消息或HTTP请求 现在,我在Java程序中以本机Java字符串的形式获得了这条消息,以及校验和。然后我使用Java生成一个MD5哈希,如下所

这是在各种语言中使用MD5库时有关字符编码的一般问题。我关心的是:假设我使用本机Python字符串对象生成MD5哈希,如下所示:

message = "hello world"
m = md5()
m.update(message)
然后我使用以下方法获取MD5哈希的十六进制版本:

m.hexdigest()
并通过网络发送消息&MD5散列,比如JMS消息或HTTP请求

现在,我在Java程序中以本机Java字符串的形式获得了这条消息,以及校验和。然后我使用Java生成一个MD5哈希,如下所示(使用Commons编解码器库):

我觉得这是错误的,因为我没有在两端指定字符编码。因此,原始哈希将基于Python版本字符串的字节;Java 1将基于字符串的Java版本的字节,这两个字节序列通常不相同-是这样吗?所以我真的需要在两端指定“UTF-8”或任何东西,对吗

(事实上,我的代码中出现了一个间歇性错误,MD5校验和失败,我怀疑这就是原因——但由于它是间歇性的,很难说更改它是否可以修复。)


谢谢大家!

是的,最好在两端散列相同的编码。在编码之前将Python字符串解码为unicode。

是的,最好在两端散列相同的编码。不过,在编码之前将Python字符串解码为unicode。

是的,您必须明确,因为MD5校验和是在字节序列上,而不是字符序列上。因此,您需要可预测的字符到字节的转换。

是的,您必须明确,因为MD5校验和是在字节序列上,而不是字符序列上。因此,您需要将字符可预测地转换为字节

String md5 = org.apache.commons.codec.digest.DigestUtils.DigestUtils.md5Hex(s)