我尝试将一些代码从JS带到Python。 我陷入了JS中的代码:
const crypto = require('crypto')
var txtToHash = "Hello¤World¤";
var md5sum = crypto.createHash('md5');
md5sum.update(new Buffer(txtToHash, 'binary'));
md5val = md5sum.digest('hex');
// equivalent to
// crypto.createHash('md5').update(urlPart, 'binary').digest('hex'));
返回:
3a091f847ee21c7c1927c19e0f29a28b
而且,在Python 3.7中,我有以下代码:
import hashlib
txtToHash = "Hello¤World¤"
md5val = hashlib.md5(txtToHash.encode()).hexdigest()
返回值:f0aef2e2e25ddf71473aa148b191dd70
为什么它们不同?我在Google或SO上找不到答案。
答案 0 :(得分:2)
您在摘要创建期间使用了两种不同的字符编码。
请确保您使用相同类型的字符编码。您的节点js实现使用的是“二进制”别名“ latin1”编码。 python中的代码使用UTf8字符编码。
当您指定txtToHash.encode()时,这意味着将文本编码为utf-8。
因此,请修改摘要的创建,以在两种环境中匹配编码相同的字符。
要么修改您的nodejs代码
md5sum.update(new Buffer(txtToHash, 'utf8'));
或将python代码修改为
md5val = hashlib.md5(txtToHash.encode('latin1')).hexdigest()
上面应该给出相同的结果>> 3a091f847ee21c7c1927c19e0f29a28b
注意: 尽管python代码给出了预期的结果。我不建议这样做,因为与utf8相比,latin1编码仅包含一小部分字符。因此,我建议您在节点js应用中将编码更改为utf-8,并在python中也应用相同的编码