为什么crypto.createHash在新版本中返回不同的输出?
问题
我有使用crypto.createHash
生成md5
散列的node.js模块。
最近我注意到crypto
模块生成的hash在新版本中是不同的:
码
require('crypto').createHash('md5').update('¥').digest('hex')
Node.js v0.10.0
输出: ab3af8566ddd20d7efc9b314abe90755
Node.js v6.1.0
输出: 07625e142e4ac5961de57472657a88c1
题
我想知道是什么原因,在新版本,我该如何解决这个问题?
更新
GitHub上的类似问题:
- https://github.com/nodejs/node/issues/6813
- https://github.com/node-xmpp/client/issues/206
Node v6 +中的一些input会计算与之前的Node版本不同的散列值。
基本上,当你将一个string传递给.update()
,在v6之前的版本中,默认编码是binary
,但是对于改变为utf-8
节点v6。
例如,拿这个代码:
require('crypto').createHash('md5').update('¥').digest('hex')
这ab3af8566ddd20d7efc9b314abe90755
在节点6上的节点6和07625e142e4ac5961de57472657a88c1
上输出ab3af8566ddd20d7efc9b314abe90755
。
如果您希望节点6输出与之前的版本相同,则必须告诉.update()
使用binary
编码:
require('crypto').createHash('md5').update('¥', 'binary').digest('hex')
或者相反(使节点6的输出与6相同):
require('crypto').createHash('md5').update('¥', 'utf-8').digest('hex')
就像在github中标记这个问题一样: https : //github.com/nodejs/node/issues/6813是在v5 / v6中更改为utf8
摘要的缺省编码,在v4和更早的版本中,它是binary