当我通过 SHA1 运行字符串时的值与使用 .charCodeAt() 检查它时的值不同

Different values when I run a string through SHA1 than when I inspect it with .charCodeAt()

本文关键字:charCodeAt 检查 字符串 运行 SHA1      更新时间:2023-09-26

我从这个奇怪的场景开始,之后有人指出我实际上得到了正确的哈希,但输入字符串的编码在某种程度上是错误的。

所以我挖得更深了。 我的 Node.js VM 中有此字符串s。 REPL:

> s
':"? O'
> s.charAt(2)
'?'
> s.charCodeAt(2)
10047
> var c = s.charAt(2)
> c.charCodeAt()
10047

仅凭这一点,我就认为字符串本身没有任何问题,只是我的终端在Windows XP上显示它(cmd.exe时遇到问题)。

但是,请查看我的 SHA1 函数以及当我尝试应用它时会发生什么:

function SHA1(m){
  var h = crypto.createHash('sha1');
  h.update(m);
  return h.digest('hex');
}
> SHA1(c)
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'

有趣的是,即使我从代码点手动构造它,它仍然会搞砸它:

> SHA1(String.fromCharCode(10047)
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'
> SHA1(String.fromCharCode(63))
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'
This seems to happen in Chrome with Rusha, as well.

这是怎么回事?

进行更新时,缓冲区是默认类型。因此,在给出字符串时,您必须显式传递它。

>  var h = crypto.createHash('sha1');
>  h.update(String.fromCharCode(10047),'utf8').digest('hex');
'902c43163c965fb0cf4c276f9b660c97a22fb355'
>  var h = crypto.createHash('sha1');
>  h.update(String.fromCharCode(63),'utf8').digest('hex');
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'