有关在S-DES中实现扩展器功能的更有效方法的简单问题

时间:2019-03-21 09:48:37

标签: c++ cryptography des

因此,我正在C ++中实现(简体)-DES,并且我有一个有效的Expander函数。扩展器函数的定义是,给定一个6项输入(例如{1,2,3,4,5,6},我们以以下形式输出一个新的8项输出:{1,2,4,3 ,4,3,5,6}。我的实现方式如下,但是我敢肯定有更好,更快的实现方式。有什么建议吗?

void expandchars(std::vector<int> &vec){
std::vector<int> temp=vec;
vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]};
}

1 个答案:

答案 0 :(得分:1)

一种更快的方法是避免分配临时向量。如果vec.capacity() < 8,则您的代码几乎是最佳的。为使其最佳:

void realloc_expandchars(std::vector<int> &vec){
  // Optimal if vec.capacity() <8, since a reallocation is unavoidable
  std::vector<int> temp=std::move(vec);
  vec={temp[0],temp[1],temp[3],temp[2],temp[3],temp[2],temp[4],temp[5]};
}

如果vec.capacity() >= 8,则可能要避免创建新向量。为此,您可能需要执行以下操作:

void inplace_expandchars(std::vector<int> &vec){
    vec.insert(vec.begin() + 4, 2 /*count*/, 0 /* value */);
    vec[4] = vec[3];
    vec[5] = vec[2];
    vec[2] = vec[4];
    vec[3] = vec[5];
}

可能稍微慢一点,但更可读的是使用std :: array:

void inplace_expandchars(std::vector<int> &vec){
    std::array<int, 8> temp = {vec[0], vec[1], vec[3], vec[2], vec[3], vec[2], vec[4], vec[5]}; 
    vec.clear();
    vec.insert(vec.begin(), temp.begin(), temp.end());
}

然后将所有内容组合在一起

   void expandchars(std::vector<int> &vec){
     if (vec.capacity() < 8)
         realloc_expandchars(vec);
     else
         inplace_expandchars(vec);
   }