我从这个奇怪的场景开始,之后有人指出我实际上得到了正确的哈希值,但是输入字符串的编码在某种程度上是错误的。
所以我挖得更深。我的 Node.js VM 中有这个字符串s
。回复:
> 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.
这里发生了什么?