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

时间:2013-11-07 12:53:15

标签: javascript node.js hash sha1

我从this bizarre scenario开始,之后有人指出我实际上得到了正确的哈希值,但输入字符串的编码有点错误。

所以我深入挖掘。我的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.

这里发生了什么?

1 个答案:

答案 0 :(得分:0)

执行更新时缓冲区是default类型。所以当给出一个字符串时,你必须明确地传递它。

>  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'