关联数组,对称算法,CTFE

时间:2011-05-22 11:47:36

标签: arrays d

我想实现类似Vigenère密码的东西,我选择使用D的关联数组。

struct Codes
{
    int[char] enc;
    char[int] dec;
}

然后我用

填充AA
foreach(immutable char c; letters ~ whitespace ~ digits)
{
    codes.enc[c] = codes.enc.length;
    codes.dec[codes.enc.length] = c;
}

它可以工作,因为它可以在我的[en / de]加密函数中工作,但我有两个问题:

  1. 如果可以,我怎么能只使用一个AA。或者它是一些其他数据结构,它易于使用,效率更高,或者更适合第2点。
  2. 我怎么想在编译时使用CTFE生成一些数据结构并在运行时使用输出。
  3. (如果这件事无论如何,我正在使用dmd v2.053编译器。)

1 个答案:

答案 0 :(得分:3)

dec可以是正常数组(它等于letters ~ whitespace ~ digits btw)

在enc中你也可以使用普通数组,如果你只允许ASCII作为字符(长度为255,并将c转换为int为索引)

修改

你可以像letters ~ whitespace ~ digits字符串那样创建一个mixin字符串

string createSwitch(string seq,string inp){
    string out = "switch("~inp~"){";
    int i=0;
    foreach(ch;seq){
        out~="case "~ch~":return "~i";";
    }
    out~="default: return -1;";
    return out;
}

然后您可以将其用作

int intFromChar(char ch){
    mixin(createSwitch(letters ~ whitespace ~ digits,"ch"));
}