Nodejs的版本从4.x升级到8.x的过程中遇到一个问题:含有中文的UTF8字符串的md5取值在升级前后不一致。研究了一下,发现Nodejs从6.x开始对crypto做了一个改进,直接支持UTF8二进制,不用单独再处理中文了,“buf.toString("binary")”这一句已经不需要了,加了反而会错。
在5.x及以下版本,用下面这个函数md5中文是对的:
getMD5Chn = function(str) {
var buf, shasum;
buf = new Buffer(str);
str = buf.toString("binary");
shasum = crypto.createHash('md5');
shasum.update(str);
return shasum.digest('hex');
};
在6.x及以上版本,用下面这个函数md5中文是对的:
function getMD5(data) {
var crypto = require('crypto');
return crypto.createHash('md5').update(data).digest('hex');
}
验证过程如下,在不同的Nodejs版本下分别调用上述两个函数:
“中文”的正确的md5值应该是“a7bac2239fcdcb3a067903d8077c4a07”
console.log("Nodejs version: " + process.version);
console.log(getMD5Chn('中文'));
console.log(getMD5('中文'));
输出:
[root@dev tutorial]# nvm use v4.6.0
Now using node v4.6.0 (npm v2.15.9)
[root@dev tutorial]# node md5.js
Nodejs version: v4.6.0
a7bac2239fcdcb3a067903d8077c4a07
eeff7ad1ae620adc859df95b565cd590
[root@dev tutorial]# nvm use v5.12.0
Now using node v5.12.0 (npm v3.8.6)
[root@dev tutorial]# node md5.js
Nodejs version: v5.12.0
a7bac2239fcdcb3a067903d8077c4a07
eeff7ad1ae620adc859df95b565cd590
[root@dev tutorial]# nvm use v6.17.1
Now using node v6.17.1 (npm v3.10.10)
[root@dev tutorial]# node md5.js
Nodejs version: v6.17.1
12af61c4e4ccfe790607e7f09de40c0a
a7bac2239fcdcb3a067903d8077c4a07
[root@dev tutorial]# nvm use v8.16.2
Now using node v8.16.2 (npm v6.4.1)
[root@dev tutorial]# node md5.js
Nodejs version: v8.16.2
12af61c4e4ccfe790607e7f09de40c0a
a7bac2239fcdcb3a067903d8077c4a07
[root@dev tutorial]# nvm use v12.16.0
Now using node v12.16.0 (npm v6.13.4)
[root@dev tutorial]# node md5.js
Nodejs version: v12.16.0
12af61c4e4ccfe790607e7f09de40c0a
a7bac2239fcdcb3a067903d8077c4a07
(node:19405) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.