Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用crypto node.js库,无法快速连续多次创建SHA-256哈希_Javascript_Node.js_Hash_Cryptography_Sha256 - Fatal编程技术网

Javascript 使用crypto node.js库,无法快速连续多次创建SHA-256哈希

Javascript 使用crypto node.js库,无法快速连续多次创建SHA-256哈希,javascript,node.js,hash,cryptography,sha256,Javascript,Node.js,Hash,Cryptography,Sha256,我正在创建一个自动递增数字的散列。我已经创建了两个循环示例来说明我是如何实现这一点的 当运行#1时,第一个散列记录到控制台,在循环的第二次迭代中,返回以下错误。错误:已调用摘要 我相信这是因为文档中有这样一个引用:Hash.digest()方法被调用后,Hash对象不能再次使用。多个调用将导致抛出错误 如何创建一个使用节点的加密库一次创建多个哈希的循环 // Reproduce #1 const crypto = require('crypto'); const hash = crypt

我正在创建一个自动递增数字的散列。我已经创建了两个循环示例来说明我是如何实现这一点的

当运行#1时,第一个散列记录到控制台,在循环的第二次迭代中,返回以下错误。错误:已调用摘要

我相信这是因为文档中有这样一个引用:Hash.digest()方法被调用后,Hash对象不能再次使用。多个调用将导致抛出错误

如何创建一个使用节点的加密库一次创建多个哈希的循环

 // Reproduce #1
 const crypto = require('crypto');

 const hash = crypto.createHash('sha256');

 for (let i = 0; i < 5; i++) {
   hash.update('secret' + i);

   console.log(hash.digest('hex'));
 }
//复制#1
const crypto=require('crypto');
const hash=crypto.createHash('sha256');
for(设i=0;i<5;i++){
hash.update('secret'+i);
console.log(hash.digest('hex');
}
如果错误是“Digest ready called”,那么最好只调用一次哈希。您可以通过在每次迭代中创建一个新的哈希实例来实现这一点:

const crypto = require('crypto');
for (let i = 0; i < 5; i++) {
    const hash = crypto.createHash('sha256');
    hash.update('secret' + i);
    console.log(hash.digest('hex'));
}
const crypto=require('crypto');
for(设i=0;i<5;i++){
const hash=crypto.createHash('sha256');
hash.update('secret'+i);
console.log(hash.digest('hex');
}
输出:

97699b7cc0a0ed83b78b2002f0e57046ee561be6942bec256fe201abba552a9e 5b11618c2e44027877d0cd0921ed166b9f176f50587fc91e7534dd2946db77d6 35224d0d3465d74e855f8d69a136e79c744ea35a675d3393360a327cbf6359a2 e0d9ac7d3719d04d3d68bc463498b0889723c4e70c3549d43681dd8996b7177f fe2d033fef7942ed06d418992d35ca98feb53943d452f5994f96934d754e15cb 97699B7CC0A0ED83B78B2002F0E57046EE561BE6942BEC2566FE201ABBA552A9E 5B1618C2E44027877D0CD0921ED166B9F176F50587FC91E7534DD2946DB77D6 35224d0d3465d74e855f8d69a136e79c744ea35a675d3393360a327cbf6359a2 E0D9AC7D3719D04D368BC463498B0889723C4E70C3549D4368DD8996B7177F FE2D033 FEF7942ED06D418992D35CA98FEB53943D452F5994F96934D754E15CB
不必在每个实例上重复
const H=crypto.createHash('sha256')
的干净方法是使用hash.copy()-


您使用的是哪个节点版本?对于#1,我必须移动
const hash=crypto.createHash('sha256')
for
循环中(实例不可重用)。对于#2,您有一个输入错误
sha1256
sha256
我有节点v8.1.2。谢谢你的打字错误提醒。第一个不起作用,因为它违反了文档中的这一点:
调用Hash.digest()方法后,无法再次使用哈希对象。多个调用将导致抛出错误。
我的目标是创建一个方法,该方法根据“API机密”对一些输入字段进行哈希运算,从而创建一个序列号。如果我把这个逻辑或任何与之有点类似的东西放进去,它就会失败。第一个生成一个有效的序列号,但后续的序列号实际上不会抛出错误。由于
.digest()
和/或
的原因,它们只是生成无效的序列。createHash()
似乎是一个库错误,重复
const H=crypto.createHash('sha256')
。。。初始化
H
必须可重复使用。。。如何请求修复它?我不完全相信。我目前的想法是,
hash.digest
将是确定性的,因此使用相同hash的后续调用将输出相同的结果。因此,每次都需要创建一个新的哈希。此外,我猜哈希对象中有一个单例本地状态字段,该字段在createHash上设置,然后在digest上重置,因此如果您连续调用createHash两次,它将检测到过时的条件。@agm1984这可能是发生错误的原因。此外,我还没有试图在我的回答中确定为什么会出现这种行为。我只提供了一种解决问题的方法。我得到的是
TypeError:hash.copy不是一个建议解决方案的函数
。根据
hash.copy([options])
的文档,它创建了一个新的hash对象,其中包含当前hash对象内部状态的深度副本。这不是OP想要的,因为复制内部状态意味着在第二次迭代期间,第一次迭代的数据也会被考虑到以生成第二个散列。
 const crypto = require('crypto');
 const hash = crypto.createHash('sha256');

 for (let i = 0; i < 5; i++) {
   hash.update('secret' + i);
   console.log(hash.copy().digest('hex'));
 }

e7ebc4daa65343449285b5736ebe98a575c50ce337e86055683452d7d612ac78
3dc562fa371a320efb0cca0ae344c8a5bddfcd3d5191cd124798404b729423c2
7547b5c1992ed566a2125817b2c76ed4a7d3c551232904f886bd954e649e3144
b49247304dc3ef76d9ebfd0482bfc68ab9b7b0fe2007b7c60e03ad6b8123be33
82bc2bcfc528fd55807a981c79e0b6aa430a690b51de79d9d0c5f5627864965b