首页 > 解决方案 > javascript中的凯撒密码技术和反向大小写

问题描述

我是初学者,想制作自己的功能。我想通过将每个字符移动给定 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 result;
  }

  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))

标签: javascriptstringhashcaesar-cipher

解决方案


您的代码中存在相当多的问题。

这里的第一个问题不仅是嵌套,还在于您使用关键字result在外部函数范围内定义变量。var然后你在不同的地方使用(读/写)那个变量。

  1. 在函数shift()中(也在return语句中)
  2. 在外部函数中(也在return语句中)

您必须了解的是,您每次都指的是同一个变量。result为确保您的变量有作用域,即仅在块(if语句、function正文等)内有效,您应该使用letorconst关键字。这使您的代码更安全。

第二个问题是您对数据类型所做的一些假设。如果您有一个字符串let s = "my string 123",则表达式typeof s[x] === 'string'true适用于每个xin s

另一个问题是算法本身。外部函数hashPassword()遍历输入字符串的所有字符。在该循环中,您调用 function shift(password[i], x),传递一个字符。的第一个参数shift()被称为text- 并且还有另一个for循环(令人困惑且没有意义)。

简而言之,请看一下这个简化版本:

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

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 result;
}

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


推荐阅读