Я пытаюсь создать скрипт, который начинается с секрета, затем хеширует его и хеширует его, написанный на Javascript w / Node. Мне нужно повторить этот процесс 5 миллионов раз. Основа кода проста, но исполнение - это то, что меня тормозит. Это то, что у меня есть до сих пор.

const secret = "Secret";  // Make the secret a const so it won't change.
var sha256 = require('sha256'); // Set-up sha256
var prehash = sha256(secret);  // Set variable 'prehash' to the hash of 'secret'
console.log(prehash);  // Display the hash
currentHash = sha256(prehash);  //Hash the previous hash
console.log(currentHash); //display the new hash

Мне нужно, чтобы он сделал пару вещей:

  1. Хеш-секрет. (Сделанный)
  2. Хешировать хеш. (Сделанный)
  3. Повторите это 5 миллионов раз.

Вот где возникает проблема.

Попытка решения №1. Если я начинаю переназначать переменные, я теряю информацию о том, какой хэш хешируется, поскольку мне приходится устанавливать каждую итерацию для новой переменной. Это занимает много времени, и я не могу проверить миллионы строк кода для 1 переменной с ошибкой только для того, чтобы обнаружить, что она не была правильно вызвана.

Попытка решения № 2 После секрета я мог бы попытаться назначить новые хеши для preHash и currentHash соответственно, но я думаю, что он устанавливает значение в строковое представление переменной, а не само значение. Вот что я имею в виду.

var preHash = sha256(secret);
currentHash = sha256(preHash);
preHash = currentHash;
currentHash = sha256(preHash);

Если они произойдут в таком порядке, я могу ожидать

  1. preHash to = хеш секрета
  2. currentHash = хеш preHash
  3. preHash имеет значение = currentHash, что в то время означает sha256 (preHash)
  4. currentHash установлен на = sha256 нового preHash

Означает ли это, что @ step 3, preHash = currentHash или

PreHash = sha256 (preHash)?

Я также изучал документацию для node и js, чтобы узнать, могу ли я;

  1. Запишите каждый вывод console.log в файл или
  2. Экспорт в виде файла CSV.

Но я не смог найти ничего, что имело бы смысл.

0
Ozyman 14 Июн 2021 в 19:04

2 ответа

Лучший ответ

Вот итеративное решение, которое продолжит передавать результаты хеширования обратно в sha256 5 миллионов раз.

const sha256 = require('sha256');
const fs = require('fs');
const secret = "Secret";
const max = 5e6; // shorthand for 5 million

let output = secret;
let hash = secret;
let i = 0;
while(i++ < max){
   hash = sha256(hash);
   output += `\n${hash}`;
}

console.log('done', hash);

// save results
const fileName = "path/to/file/output.csv"; // overwrite for desired name
fs.writeFile(fileName, output, err => console.log(err));

Я подозреваю, что это будет очень медленно, если вы хотите отслеживать результаты каждого хэша, а затем записывать их в файл. Сначала вы должны попытаться запустить этот блок для меньших значений max и перейти оттуда. Убедившись в этом, удалите шаги, которые создают строку вывода и распечатывают результаты.

1
GenericUser 14 Июн 2021 в 20:20

Предупреждение: это будет не быстро, и это всего лишь очень наивный подход

Использование функции pipe из https: // www.freecodecamp.org/news/pipe-and-compose-in-javascript-5b04004ac937/ мы можем определить f(g(x)) как pipe(f,g)(x).

Таким образом, мы можем затем использовать Array(5,000,000).fill(f), чтобы дать нам 5 миллионов ссылок на функцию f.

Затем мы можем передать это аргументу для pipe, и он вернет нам функцию, которая будет запускать функцию f 5 миллионов раз, передавая возврат от одного к вводу следующего.

const pipe = (fns) => (x) => fns.reduce((v, f) => f(v), x);
const addOne = (x) => x+1;

const arrayOfFuncs = Array(5_000_000).fill(addOne);

const addOneChungus = pipe(arrayOfFuncs);

console.log(
  addOneChungus(0)
);
1
evolutionxbox 14 Июн 2021 в 16:33