[英]Why hash in Node.js give different result with same character?
所以我试图在节点js中哈希¤
字符,使用此函数crypto.createHash('md5').update('¤', 'ascii').digest('hex')
给md5哈希
f37c6f3896b2c85fbbd01ae32e47b43f
和使用Buffer
crypto.createHash('md5').update(new Buffer('¤', 'ascii').toString()).digest('hex')
给出这样的结果:
9b759040321a408a5c7768b4511287a6
我试图调试Hash.update()
以查看内部,但我似乎很难编译。
为什么Buffer
crypto
编码方法不同? 有什么不同呢?
crypto的编码方式与缓冲区的编码方式相同,因此暂时忽略它。 这是问题的简化:
const text = '¤';
const b1 = Buffer.from(text, 'ascii');
const b2 = Buffer.from(b1.toString());
b1和b2不是相同的字节。 b1是[0xa4],因为0xa4不是ASCII的一部分,所以实际上没有多大意义。 Node在这里使用与ASCII和Latin-1相同的代码来编码字符串 。 我不知道这是出于兼容性还是性能原因,还是什么原因,但这似乎是一个坏主意,导致Buffer.from(s, 'ascii')
与Buffer.from(Buffer.from(s, 'ascii').toString('ascii'), 'ascii')
Buffer.from(s, 'ascii')
不同Buffer.from(Buffer.from(s, 'ascii').toString('ascii'), 'ascii')
,并且似乎未在任何地方进行记录。
在现代版本的Node中,默认编码为UTF-8,因此b1.toString()
将尝试将0xa4
解释为UTF-8,失败并产生替换字符(。),编码为[0xef,0xbf,0xbd ]。 在非现代版本的Node中,它将执行与环境有关的错误操作,而不是一致的错误操作。
您可以通过传递缓冲区而不是缓冲区的UTF-8编码来使操作得到相同的结果:
crypto.createHash('md5').update(new Buffer('¤', 'ascii')).digest('hex')
(请注意如何删除.toString()
)
但是能够对任何Unicode代码点序列进行哈希处理的正确代码将改用UTF-8。
crypto.createHash('md5').update('¤', 'utf8').digest('hex')
crypto.createHash('md5').update(Buffer.from('¤', 'utf8')).digest('hex')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.