为什么在新版本中 crypto.createHash returns 输出不同?

Why crypto.createHash returns different output in new version?

问题

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

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

代码

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

Node.js v0.10.0

输出:ab3af8566ddd20d7efc9b314abe90755

Node.js v6.1.0

输出:07625e142e4ac5961de57472657a88c1

问题

我想知道在新版本中是什么原因导致的,我该如何解决?

更新

GitHub 上的类似问题:

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

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

例如,拿这个代码:

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

这在节点 pre-6 上输出 ab3af8566ddd20d7efc9b314abe90755,在节点 6 上输出 07625e142e4ac5961de57472657a88c1

如果你想让Node 6输出和pre-6一样的输出,你必须告诉.update()使用binary编码:

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

或者反过来(使 Node pre-6 输出与 6 相同):

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

就像在github中标记这个问题一样: https://github.com/nodejs/node/issues/6813 是关于在 v5/v6 中更改为 utf8 的摘要的默认编码,在 v4 和更早版本中它是 binary