Nodejs版本升级导致UTF8中文字符串的md5取值前后不一致的问题

2 篇文章 0 订阅
2 篇文章 0 订阅

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.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值