繁体   English   中英

为什么Node.js中的哈希值使用相同字符给出不同的结果?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM