#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
ключевого слова. Затем вы используете (чтение/запись) эту переменную в разных местах.
- В функции
shift()
(также вreturn
инструкции) - Во внешней функции (также в
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