gpt4 book ai didi

javascript - 为什么 Node.js 中的哈希对于相同的字符给出不同的结果?

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:44 26 4
gpt4 key购买 nike

所以我尝试用这个函数在 Node js中散列¤字符crypto.createHash('md5').update('¤', 'ascii').digest('hex')给出 md5 哈希

f37c6f3896b2c85fbbd01ae32e47b43f

并使用缓冲区

crypto.createHash('md5').update(new Buffer('¤', 'ascii').toString()).digest('hex')

给出这样的结果:

9b759040321a408a5c7768b4511287a6

我尝试调试 Hash.update() 以查看内部情况,但我不能,它似乎很难编译。

为什么crypto编码方式与Buffer不同?是什么让它与众不同?

最佳答案

加密的编码方式与缓冲区相同,所以我们暂时忽略它。这是问题的简化:

const text = '¤';
const b1 = Buffer.from(text, 'ascii');
const b2 = Buffer.from(b1.toString());

b1 和 b2 不是相同的字节。 b1 是 [0xa4],这并没有多大意义,因为 0xa4 不是 ASCII 的一部分; Node is using the same code to encode strings as ASCII and Latin-1 here 。我不知道这是否出于兼容性或性能原因,但这似乎是一个坏主意,导致 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')

关于javascript - 为什么 Node.js 中的哈希对于相同的字符给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48898490/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com