为什么 digest 和 digest('hex') 会产生不同的输出?

why does digest and digest('hex') result in different outputs?

我有2段代码。

1ST ONE
const hash1 = (data) => createHash('sha256').update(data).digest('hex');
var a1 = hash1("A");
var b1 = hash1("B");
console.log(hash1(a1+b1));

2ND ONE
const hash2 = (data) => createHash('sha256').update(data).digest();
var a2 = hash2("A");
var b2 = hash2("B");
console.log(hash2(Buffer.concat([a2,b2])).toString('hex'));

为什么他们打印出不同的结果?

digest('hex')digest() 是相同的,但格式不同,但仍然相同。那么,为什么我在控制台中得到不同的结果?当我对十六进制求和时与对缓冲区求和时是 + 运算符吗?为什么?

digest('hex')digest() 技术上不同

请试试这个代码

var crypto = require('crypto');

const hash1 = (data) => crypto.createHash('sha256').update(data).digest('hex');
var a1 = hash1("A");
var b1 = hash1("B");

//console.log(a1)
//console.log(b1)


console.log(hash1(a1+b1));

const hash2 = (data) => crypto.createHash('sha256').update(data).digest();

var a2 = hash2("A");
var b2 = hash2("B");
//console.log(a2.toString("hex"))
//console.log(b2.toString("hex"))

console.log(hash2(a2.toString("hex") + b2.toString("hex") ).toString("hex"));

首先,您要附加两个 hex 字符串并传递给 hash1
在第二个中,您附加了两个非十六进制字符串并传递给 hash2

Run Nodejs online

hash.digest([encoding]) 的默认编码是 utf-8utf-8 是一个 variable-length 编码系统。它只会使用尽可能多的字节来表示每个字符(1-4 字节之间的任意位置)。

但是,当您指定 hex 作为编码时,每个字符都存储为 正好 2 个十六进制字符。

当您在 utf-8 编码散列上调用 hash.toString('hex') 时,生成的十六进制表示等价于首先使用 hex 编码进行散列(如 hash.digest('hex') ).

因此,即使 hex 表示在每种情况下都相同,但实际的 data 是不同的。即:

hash.digest() != hash.digest('hex'),但是

hash.digest().toString('hex') == hash.digest('hex').