6

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

我有一个使用crypto.createHash生成md5散列的node.js模块。

最近我留意到,crypto模块产生的散列是在新的版本有所不同:

代码

require('crypto').createHash('md5').update('¥').digest('hex') 

Node.js的v0.10.0

输出:ab3af8566ddd20d7efc9b314abe90755

个Node.js的V6.1.0

输出:07625e142e4ac5961de57472657a88c1

问题

我想知道是什么原因,在新的版本,我该怎么解决这个问题?

更新

在GitHub上类似的问题:

回答

17

在节点V6 +一些投入计算不同的哈希比以前的版本的节点。

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

例如,借此代码:

require('crypto').createHash('md5').update('¥').digest('hex') 

此输出在节点6.

在节点ab3af8566ddd20d7efc9b314abe90755预6和07625e142e4ac5961de57472657a88c1如果要节点6到输出相同的预6版本,你要告诉.update()使用binary编码:

require('crypto').createHash('md5').update('¥', 'binary').digest('hex') 

或周围的其他方式(使节点前6输出的同6):

require('crypto').createHash('md5').update('¥', 'utf-8').digest('hex') 
+0

是这些编码(二进制/ utf-8)是否按字符内字节顺序不同? –

+1

@vp_arth没有太多字节_order_,但它们以字节表示的方式不同。我认为'binary'是拉丁-1编码(它可以表示的字符数量有限,我猜这是为什么默认为Node v6更改为'utf-8'的原因)。 – robertklep

相关问题