Javascript 为什么crypto.createHash在新版本中返回不同的输出?

Javascript 为什么crypto.createHash在新版本中返回不同的输出?,javascript,node.js,hash,backwards-compatibility,node-crypto,Javascript,Node.js,Hash,Backwards Compatibility,Node Crypto,问题 我有node.js模块,它使用crypto.createHash生成md5哈希 最近我注意到,crypto模块生成的哈希在新版本中有所不同: 代码 require('crypto').createHash('md5').update('¥').digest('hex') Node.js v0.10.0 输出:ab3af8566ddd20d7efc9b314abe90755 Node.jsv6.1.0 输出:07625e142e4ac5961de57472657a88c1 问题 我想知道在

问题

我有node.js模块,它使用
crypto.createHash
生成
md5
哈希

最近我注意到,
crypto
模块生成的哈希在新版本中有所不同:

代码

require('crypto').createHash('md5').update('¥').digest('hex')
Node.js v0.10.0

输出:
ab3af8566ddd20d7efc9b314abe90755

Node.jsv6.1.0

输出:
07625e142e4ac5961de57472657a88c1

问题

我想知道在新版本中是什么原因造成的,我如何解决这个问题

更新

require('crypto').createHash('md5').update('¥').digest('hex')
GitHub上的类似问题:


节点v6+中的某些输入计算的哈希值与以前的节点版本不同

基本上,当您将字符串传递到
.update()
时,对于v6之前的节点版本,默认编码为
二进制
,但对于更改为
utf-8
的v6节点

例如,以以下代码为例:

require('crypto').createHash('md5').update('¥').digest('hex')
这将在节点6之前输出
ab3af8566ddd20d7efc9b314abe90755
,在节点6上输出
07625e142e4ac5961de57472657a88c1

如果希望节点6的输出与6之前的版本相同,则必须告诉
.update()
使用
二进制编码:

require('crypto').createHash('md5').update('¥', 'binary').digest('hex')
或者反过来(使节点6之前的输出与6相同):


就像在github中标记此问题一样: 是关于在v5/v6和v4及更早版本中更改为
utf8
的摘要的默认编码,它是
binary

这些编码(binary/utf-8)是否在字符字节顺序上有所不同?@vp\u不是太多字节顺序,但它们在字节中的表示方式不同。我相信
binary
是拉丁-1编码(它可以表示的字符数有限,我想这就是为什么节点v6的默认值更改为
utf-8
)。