2

如果我尝试从“ABC”获取 sha1,它们在 PHP 和 Node.JS 中是相同的。

function sha1(input) {
  return crypto.createHash('sha1').update(input).digest('hex');
};

但是,如果我尝试对像这样的西里尔字母进行散列:“ЭЮЯЁ”,它们不是。

如何解决?

4

1 回答 1

4

问题可能是字符集/编码不匹配

如果 PHP 中的字符串是 UTF-8 编码的,您可以通过指定在 Node.js 中进行镜像'utf8'

function sha1(input) {
  return crypto.createHash('sha1').update(input, 'utf8').digest('hex');
};
> crypto.createHash('sha1').update('ЭЮЯЁ').digest('hex')
'da7f63ac9a3b5c67c8920871145cb5904f3df29a'
> crypto.createHash('sha1').update('ЭЮЯЁ', 'utf8').digest('hex')
'f78c3521413a8321231e35665f8c4a16550e182a'

'ABC'将有更好的匹配机会,因为这些都是ASCII字符,而 ASCII 是许多其他字符集的起点。当您超越 ASCII 时,您会更经常地遇到冲突。

于 2013-04-24T20:26:04.873 回答