替代密码字母映射数据结构

时间:2013-07-25 17:40:43

标签: c# data-structures

哪种数据结构更好地存储以下替换密码字母映射?

abcdefghijklmnopqrstuvwxyz
qpalzxmskwoeidjcnvbfhguryt

我目前正在使用两个词典,但必须有一些更简单的东西:

char[] alphabet = {'a', 'b', 'c', 'd', 'e',
                   'f', 'g', 'h', 'i', 'j',
                   'k', 'l', 'm', 'n', 'o',
                   'p', 'q', 'r', 's', 't',
                   'u', 'v', 'w', 'x', 'y', 'z'};
char[] mappings = {'q', 'p', 'a', 'l', 'z',
                   'x', 'm', 's', 'k', 'w',
                   'o', 'e', 'i', 'd', 'j',
                   'c', 'n', 'v', 'b', 'f',
                   'h', 'g', 'u', 'r', 'y', 't'};

Dictionary<char, char> encrypt = new Dictionary<char, char>();
Dictionary<char, char> decrypt = new Dictionary<char, char>();

for (int i = 0; i < 26; i++)
{
    encrypt.Add(alphabet[i], mappings[i]);
    decrypt.Add(mappings[i], alphabet[i]);
}

2 个答案:

答案 0 :(得分:1)

你的方法已经是最好的了。但是,尝试将您的词典包装在一个类中,就像Jon Skeet在这里所做的那样:Getting key of value of a generic Dictionary?

答案 1 :(得分:0)

以下是如何简化事情:

只需使用char []进行加密,使用另一个进行解密。您可以通过字母的ascii值对其进行索引,因此您使用更大的数组(256而不是26),但代码更简单。

考虑这样的事情:

string mapping="bcdefghij...za"; // simple example to code 'a' as 'b'.

char[] encode = new char[256];
char[] decode = new char[256];

for (char a='a'; a<='z'; a++) {
  encode[a]=mapping[a-'a'];
  decode[ mapping[a-'a'] ] = a;
}

然后你可以使用LINQ作为编码函数,如下所示:

string encodeString(string plaintext) {
  return new string( plaintext.Select(c=>encode[c]).ToArray() );
}

您可能需要在其中添加一些类型转换(我没有尝试编译代码),但这个想法都在这里。