Техника шифрования Цезаря и обратный регистр в javascript

#javascript #string #hash #caesar-cipher

Вопрос:

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

Я думаю, что приведенный ниже код должен возвращать «EFGH7654», но он возвращает 55 без сообщения об ошибке. Как я могу это исправить? Это из-за того, что я вставил функцию в функцию? Или я что-то печатаю неправильно?

 function hashPassword(password, x) {
  // password is a string, x is a number
  // return a string
  // (ex. password = 'ab1By', x = 3 so it should return "DE4eB")
  function shift(text, s) {
    result = "";
    for (let i = 0; i < text.length; i  ) {
      let char = text[i];
      if (char.toUpperCase(text[i])) {
        let ch = String.fromCharCode((char.charCodeAt(0)   s - 65) % 26   65);
        result  = ch;
      } else {
        let ch = String.fromCharCode((char.charCodeAt(0)   s - 97) % 26   97);
        result  = ch;
      }
    }
    return resu<
  }

  function reversecase(x) {
    var output = '';
    for (var i = 0, len = x.length; i < len; i  ) {
      var character = x[i];
      if (character == character.toLowerCase()) {
        // The character is lowercase
        output = output   character.toUpperCase();
      } else {
        // The character is uppercase
        output = output   character.toLowerCase();
      }
    }
    return output
  }

  var str = "";
  var result = "";
  var charcode = "";
  for (var i = 0; i < password.length; i  ) {
    if (typeof password[i] === typeof str) {
      char = shift(password[i], x)
      charcode = reversecase(char)
      result  = charcode;
    } else {
      num = password[i]   x
      number = num % 10
      result  = number.toString()
    }
  }
  return result
};
console.log(hashPassword("abcd4321", 4)) 

Комментарии:

1. reverse to lowercase/uppercase — Если да, то не должен ли ожидаемый результат быть EFGH7654

Ответ №1:

В вашем коде есть довольно много проблем.

Первая проблема здесь заключается не только в вложенности, но и в том факте, что вы определяете result переменную во внешней области действия функции с помощью var ключевого слова. Затем вы используете (чтение/запись) эту переменную в разных местах.

  1. В функции shift() (также в return инструкции)
  2. Во внешней функции (также в return инструкции)

Дело в том, что вы должны понимать, что вы каждый раз ссылаетесь на одну и ту же переменную result . Чтобы убедиться, что ваши переменные ограничены областью действия, т. Е. допустимы только в пределах блока ( if оператор, function тело и т.д.), вы должны использовать let const ключевые слова или. Это делает ваш код намного безопаснее.

Вторая проблема заключается в некоторых предположениях, которые вы делаете относительно типов данных. Если у вас есть строка let s = "my string 123" , выражение typeof s[x] === 'string' будет true для каждого x in s .

Другая проблема заключается в самом алгоритме. Внешняя функция hashPassword() выполняет итерацию по всем символам входной строки. В этом цикле вы вызываете функцию shift(password[i], x) , передавая один символ. Первый параметр shift() вызывается text — и возникает еще for один цикл (который сбивает с толку и не имеет смысла).

Короче говоря, пожалуйста, взгляните на эту упрощенную версию:

 function shift(char, x) {
    let resu<
    
    const code = char.charCodeAt(0);
    if (code >= 65 amp;amp; code < 91) {
      result = String.fromCharCode((code   x - 65) % 26   65);
    }
    else if (code >= 48 amp;amp; code <= 57) {
      result = String.fromCharCode((code   x - 48) % 10   48);
    }
    else {
      result = String.fromCharCode((code   x - 97) % 26   97);
    }
    
    return resu<
}

function reverseCase(character) {
  if (character === character.toLowerCase()) {
    return character.toUpperCase();
  } 
  else {
    return character.toLowerCase();
  }
}

function hashPassword(password, x) {
  let result = "";
  for (let i = 0; i < password.length; i  ) {
    const char = shift(password[i], x);
    result  = reverseCase(char);
  }
  return resu<
}

console.log(hashPassword("abcd4321", 4)); // Output: EFGH8765