我从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.
这里发生了什么?
答案 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'