为什么 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
hash.digest([encoding])
的默认编码是 utf-8
。 utf-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')
.
我有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
hash.digest([encoding])
的默认编码是 utf-8
。 utf-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')
.